mqtt_communication.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "mqtt_communication.h"
  2. void Tof3DMqttAsyncClient::init(const std::string &file) {
  3. m_message_arrived_callback_ = CloudDataArrived;
  4. MqttAsyncClient::init_from_proto(file);
  5. condit = new Thread_condition();
  6. t = new std::thread(&Tof3DMqttAsyncClient::run, this);
  7. condit->notify_all(true);
  8. }
  9. // 识别结果数据包含识别结果、时间序号、具体识别信息
  10. int Tof3DMqttAsyncClient::CloudDataArrived(MqttAsyncClient *client, char *topicName, int topicLen,
  11. MQTTAsync_message *message) {
  12. // 1、查看识别结果
  13. // 2、队列取数据
  14. // cv::Mat merge_mat = cv::Mat::zeros(480 * 2, 640 * 2, CV_8UC1);
  15. // memcpy(merge_mat.data, message->payload, message->payloadlen);
  16. // cv::imshow("receive", merge_mat);
  17. LOG(INFO) << topicName;
  18. // 3、分离出四份点云
  19. // 4、发送对应队列
  20. return 1;
  21. }
  22. void Tof3DMqttAsyncClient::run() {
  23. std::this_thread::sleep_for(std::chrono::milliseconds(3000));
  24. auto t_start_time = std::chrono::steady_clock::now();
  25. std::chrono::duration<double> cost = std::chrono::steady_clock::now() - t_start_time;
  26. while (condit->is_alive()) {
  27. condit->wait();
  28. cost = std::chrono::steady_clock::now() - t_start_time;
  29. std::this_thread::sleep_for(std::chrono::milliseconds(100 - std::min<int>(99, cost.count() * 1000)));
  30. t_start_time = std::chrono::steady_clock::now();
  31. if (condit->is_alive()) {
  32. // // 1、获取图片并合并
  33. // cv::Mat merge_mat = cv::Mat::zeros(480 * 2, 640 * 2, CV_8UC1);
  34. // DeviceTof3D::DeviceTof3DSaveInfo devices_info[DeviceAzimuth::DEVICE_AZIMUTH_MAX];
  35. // for (int device_index = 0; device_index < DeviceAzimuth::DEVICE_AZIMUTH_MAX; device_index++) {
  36. // devices_info[device_index] = DeviceTof3D::iter()->getDeviceSaveInfo((DeviceAzimuth) device_index);
  37. // devices_info[device_index].irMat.copyTo(merge_mat(cv::Rect((device_index & 0x1) * 640,
  38. // ((device_index & 0x2) >> 1) * 480, 640, 480)));
  39. // }
  40. // cv::imshow("merge_mat", merge_mat);
  41. // cv::waitKey(1);
  42. // // 2、信息放入队列
  43. // m_cloud_mutex.lock();
  44. // for (auto iter = m_lf_info.begin(); iter != m_lf_info.end();) {
  45. // long save_time = std::chrono::steady_clock::now().time_since_epoch().count() - iter->first;
  46. // if (save_time > 1000000000) {
  47. // m_rf_info.erase(iter->first);
  48. // m_lr_info.erase(iter->first);
  49. // m_rr_info.erase(iter->first);
  50. // iter = m_lf_info.erase(m_lf_info.find(iter->first));
  51. // } else {
  52. // iter++;
  53. // }
  54. // }
  55. // long time_point = std::chrono::steady_clock::now().time_since_epoch().count();
  56. // m_lf_info.insert(std::pair<long, DeviceTof3D::DeviceTof3DSaveInfo>(
  57. // time_point, devices_info[DeviceAzimuth::DEVICE_AZIMUTH_LF]));
  58. // m_rf_info.insert(std::pair<long, DeviceTof3D::DeviceTof3DSaveInfo>(
  59. // time_point, devices_info[DeviceAzimuth::DEVICE_AZIMUTH_RF]));
  60. // m_lr_info.insert(std::pair<long, DeviceTof3D::DeviceTof3DSaveInfo>(
  61. // time_point, devices_info[DeviceAzimuth::DEVICE_AZIMUTH_LR]));
  62. // m_rr_info.insert(std::pair<long, DeviceTof3D::DeviceTof3DSaveInfo>(
  63. // time_point, devices_info[DeviceAzimuth::DEVICE_AZIMUTH_RR]));
  64. // m_cloud_mutex.unlock();
  65. // 3、将ir图打包发送mqtt
  66. // std::vector<unsigned char> message;
  67. //// message.push_back(time_point);
  68. //
  69. //// for (int rows = 0; rows < merge_mat.rows - 0; rows++) {
  70. //// for (int cols = 0; cols < merge_mat.cols - 0; cols++) {
  71. //// message.push_back(merge_mat.at<uchar>(rows, cols));
  72. //// }
  73. //// }
  74. // for (auto iter = merge_mat.datastart; iter != merge_mat.dataend; iter++) {
  75. // message.push_back(*iter);
  76. // }
  77. // cv::Mat merge_mat_2 = cv::Mat::zeros(480 * 2, 640 * 2, CV_8UC1);
  78. // memcpy(merge_mat_2.data, message.data(), message.size());
  79. std::vector<unsigned char > test;
  80. for (int i = 0; i < 640*480*2*1; i++) {
  81. test.push_back('a');
  82. }
  83. LOG(INFO) << "message size " << test.size();
  84. SendMessage("tof/ir", test.data(), test.size());
  85. }
  86. }
  87. }