ConnectionManager.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace jiaruan;
  3. class ConnectionManager {
  4. private $connections = array();
  5. private $city_stations = array();
  6. public function add( $mac, $connection ){
  7. //获取基站城市id
  8. //$cityid = get_station_cityid($mac);
  9. //log_debug('cityid:'. $cityid . '-' . $mac);
  10. $cityid=1;
  11. //添加在所有链接变量
  12. $connection->online_time = time();
  13. $connection->cityid = $cityid;
  14. $connection->station_mac = $mac;
  15. $this->connections[$mac] = $connection;
  16. //更新到县区的基站信息
  17. $this->city_stations[$cityid][$mac] = 1;
  18. }
  19. public function remove( $connection ){
  20. //获取连接
  21. $mac = $connection->station_mac;
  22. $cityid = $connection->cityid;
  23. //从城市基站中移除该基站
  24. unset( $this->city_stations[$cityid][$mac]);
  25. //从所有连接中移除连接
  26. unset( $this->connections[$mac]);
  27. }
  28. public function heartbeat( $connection ){
  29. //添加在所有链接变量
  30. $connection->online_time = time();
  31. $mac = $connection->station_mac;
  32. $cityid = $connection->cityid;
  33. $this->connections[$mac] = $connection;
  34. //更新到县区的基站信息
  35. $this->city_stations[$cityid][$mac] = 1;
  36. }
  37. public function send_one( $mac, $cmd ){
  38. //检查长连接是否存在
  39. $conn = $this->connections[$mac];
  40. if (!$conn) {
  41. log_debug('基站mac不在线:' . $mac);
  42. return array('success'=>false, 'message'=>"基站不在线");
  43. }
  44. $cmd['mac'] = $conn->station_mac;
  45. //发送命令
  46. if (false === $conn->send(json_encode($cmd))) {
  47. log_debug('发送命令失败基站mac:' . $mac.json_encode($cmd));
  48. return array('success'=>false, 'message'=>"命令发送失败,基站不在线");
  49. } else {
  50. log_debug('发送命令成功基站mac:' . $mac.json_encode($cmd));
  51. return array('success'=>true, 'message'=>"命令发送已成功");
  52. }
  53. }
  54. public function send_city( $cityid, $cmd ){
  55. //遍历所有基站并发送命令
  56. $stations = array_keys($this->city_stations[$cityid]);
  57. if (count($stations) == 0) {
  58. log_debug('当前城市的基站是0');
  59. return array('success' => true, 'message' => '当前城市没有在线基站');
  60. }
  61. $fails = [];
  62. foreach($stations as $mac){
  63. $cmd['mac'] = $mac;
  64. $conn = $this->connections[$mac];
  65. if($conn){
  66. $ret = $conn->send(json_encode($cmd));
  67. if ($ret === false){
  68. log_debug('所在城市发送命令失败,基站mac: ' . $mac . json_encode($cmd) );
  69. $fails[] = $mac;
  70. }
  71. else {
  72. log_debug('所在城市发送命令成功,基站mac: ' . $mac . json_encode($cmd) );
  73. }
  74. }
  75. else{
  76. $fails[] = $mac;
  77. log_debug('找不到基站长连接,基站mac: ' . $mac . json_encode($cmd) );
  78. }
  79. }
  80. if (count($fails) != 0)
  81. return array('success'=>false, 'message'=>'发送命令失败的基站mac:' . json_encode($fails));
  82. else
  83. return array('success'=>true, 'message'=>'发送命令成功');
  84. }
  85. public function send_multi( $macs ){
  86. foreach($macs as $mac){
  87. //检查长连接是否存在
  88. $conn = $this->connections[$mac];
  89. if ($conn) {
  90. $cmd['mac'] = $mac;
  91. $result = $conn->send(json_encode($cmd));
  92. }
  93. else{
  94. log_debug('找不到基站长连接,基站mac: ' . $mac . json_encode($cmd) );
  95. }
  96. }
  97. return array('success'=>true, 'message'=>"命令发送已成功");
  98. }
  99. public function send_all( $cmd ){
  100. $fails = array();
  101. foreach ($this->connections as $conn) {
  102. $cmd['msgid'] = $conn->request->msgid;
  103. $cmd['mac'] = $conn->request->mac;
  104. if (false === $conn->send(json_encode($cmd))) {
  105. $fails[] = $conn->request->mac;
  106. log_debug('发送升级命令失败基站mac:' . $conn->request->mac);
  107. } else {
  108. log_debug('发送升级命令成功基站mac:' . json_encode($cmd));
  109. }
  110. }
  111. return array('success'=>true, 'message'=>"命令发送已成功,失败的为" . json_encode($fails));
  112. }
  113. }