笔者最近在研究资产监测设备过程中使用到OPL1200芯片做开发,其中重点使用的功能之一是wifiscan,获取多组mac,并且按照信号强度排序。
但笔者团队有新入职的员工对资产监测设备和该功能的实现还较为陌生,借此机会,笔者将相关内容总结如下,以便后期提升团队整体的效率。
资产监测设备简介: 资产监测设备是帮助用户实时追踪运输中的资产,避免资产在运输中受损或丢失。资产监测设备的主要工作原理是通过定位技术和传感技术,将设备所处的位置与状态信息进行采集,再通过通信模块和网络将信息传递至云端后台。资产监测设备的主要应用场景包括对易碎物品、贵重物品、长途运输物品进行监测,避免在运输途中出现异常情况,导致资产受损。
资产监测设备能够正常使用与信号的强弱密切相关,如何使用OPL1200芯片的wifiscan功能,获取多组mac ? 笔者通过以下代码实现。
主要任务函数如下: #define RSSI_MIN (-120) static SemaphoreHandle_t SH_wifiscan; /* Function: App_WifiScan Description: scan获取mac并按照信号强弱排序 Param: char *wifiscan Return: true:成功 false:失败 */ bool App_WifiScan(char *wifiscan_str) { uint16_t ap_num =0; wifi_scan_list_t p_scan_list; memset(&p_scan_list,0,sizeof(wifi_scan_list_t)); memset(wifiscan_str,0,strlen(wifiscan_str)); wifi_start(); if(pdTRUE != xSemaphoreTake(SH_wifiscan,3000)) { strcpy(wifiscan_str,"{“mac”;,“rsi”:}"); return false; } wifi_stop(); wifi_scan_get_ap_num(&ap_num); // printf(“ap_num =%d\r\n”,ap_num); if(ap_num == 0) { strcpy(wifiscan_str,"{“mac”;,“rsi”:}"); return false; } wifi_scan_get_ap_list(&p_scan_list); int num = (ap_num>6)?6:ap_num; int8_t rssi = RSSI_MIN; int8_t p; char str[50]; #if 0 for(int i = 0;i < ap_num;i++) { printf(“mac = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x ,”, p_scan_list.ap_record[i].bssid[0], p_scan_list.ap_record[i].bssid[1], p_scan_list.ap_record[i].bssid[2], p_scan_list.ap_record[i].bssid[3], p_scan_list.ap_record[i].bssid[4], p_scan_list.ap_record[i].bssid[5]);
printf("rssi = %d\r\n",p_scan_list.ap_record[i].rssi);
}
#endif for(int i = 0;i < num;i++) { rssi = RSSI_MIN; for(int j=0;j<ap_num;j++) { if(p_scan_list.ap_record[j].rssi > rssi) { rssi = p_scan_list.ap_record[j].rssi; p = j; } } sprintf_mac_rssi(p_scan_list.ap_record[p].bssid,p_scan_list.ap_record[p].rssi,str); strcat(wifiscan_str,str); if(i!=num-1) strcat(wifiscan_str,","); p_scan_list.ap_record[p].rssi = RSSI_MIN;
} return true; } //按照JSON格式生产mac扫描结果 void sprintf_mac_rssi(uint8_t *mac,int rssi,char *str) { sprintf(str,"{“mac”:"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",“rssi”:%d}",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],rssi); } //wifiscan int wifi_do_scan(wifi_scan_type_t mode) { wifi_scan_config_t scan_config; memset(&scan_config, 0, sizeof(scan_config)); scan_config.show_hidden = 1; scan_config.scan_type = mode; wifi_scan_start(&scan_config, NULL); return 0; } //wifiscan event callback int wifi_event_handler_cb(wifi_event_id_t event_id, void data, uint16_t length) { switch(event_id) { case WIFI_EVENT_STA_START: printf("\r\nWi-Fi Start \r\n"); wifi_do_scan(WIFI_SCAN_TYPE_MIX); break; case WIFI_EVENT_STA_STOP: printf("\r\nWi-Fi Stop \r\n"); break; case WIFI_EVENT_SCAN_COMPLETE: printf("\r\nWi-Fi Scan Done \r\n"); xSemaphoreGive(SH_wifiscan); break; default: printf("\r\n Unknown Event %d \r\n", event_id); break; } return 0; } //wifi init void WifiAppInit(void) { SH_wifiscan = xSemaphoreCreateBinary(); / Event Loop Initialization / wifi_event_loop_init((wifi_event_cb_t)wifi_event_handler_cb); / Initialize wifi stack and register wifi init complete event handler */ wifi_init(NULL, NULL); } 资产监测设备的运用范围随着相关技术的不断发展,未来将会被广泛应用于更多行业。
|