_network_WLAN.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #include "_network_WLAN.h"
  2. #include "../pikascript-lib/PikaStdDevice/pika_hal.h"
  3. #include "PikaStdData_List.h"
  4. #include "PikaStdData_Tuple.h"
  5. #define check_res(res) \
  6. if (res != 0) { \
  7. pika_platform_printf("check_res failed: %d, at %s:%d:%s()\r\n", res, \
  8. __FILE__, __LINE__, __FUNCTION__); \
  9. }
  10. void _network_WLAN___init__(PikaObj* self, int interface_id) {
  11. pika_dev* hal_wifi = pika_hal_open(PIKA_HAL_WIFI, "WLAN0");
  12. if (hal_wifi == NULL) {
  13. return;
  14. }
  15. pika_hal_WIFI_config cfg = {0};
  16. cfg.mode = interface_id;
  17. check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_CONFIG, &cfg));
  18. obj_setPtr(self, "hal_wifi", hal_wifi);
  19. }
  20. void _network_WLAN_active(PikaObj* self, int is_active) {
  21. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  22. if (hal_wifi == NULL) {
  23. return;
  24. }
  25. if (is_active) {
  26. check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_ENABLE));
  27. return;
  28. }
  29. check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_DISABLE));
  30. return;
  31. }
  32. int _network_WLAN_checkActive(PikaObj* self) {
  33. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  34. if (hal_wifi == NULL) {
  35. return -1;
  36. }
  37. int is_active = 0;
  38. check_res(
  39. pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_GET_ACTIVE, &is_active));
  40. return is_active;
  41. }
  42. void _network_WLAN_config(PikaObj* self, PikaDict* kwargs) {
  43. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  44. if (hal_wifi == NULL) {
  45. return;
  46. }
  47. pika_hal_WIFI_config cfg = {0};
  48. if (pikaDict_isArgExist(kwargs, "ssid")) {
  49. strcpy(cfg.ap_ssid, pikaDict_getStr(kwargs, "ssid"));
  50. }
  51. if (pikaDict_isArgExist(kwargs, "password")) {
  52. strcpy(cfg.ap_password, pikaDict_getStr(kwargs, "password"));
  53. }
  54. if (pikaDict_isArgExist(kwargs, "channel")) {
  55. cfg.channel = pikaDict_getInt(kwargs, "channel") + 1;
  56. }
  57. check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_CONFIG, &cfg));
  58. }
  59. Arg* _network_WLAN_checkConfig(PikaObj* self, char* param) {
  60. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  61. if (hal_wifi == NULL) {
  62. return NULL;
  63. }
  64. pika_hal_WIFI_config* cfg = hal_wifi->ioctl_config;
  65. if (strcmp(param, "ssid") == 0) {
  66. return arg_newStr(cfg->ap_ssid);
  67. } else if (strcmp(param, "password") == 0) {
  68. return arg_newStr(cfg->ap_password);
  69. } else if (strcmp(param, "channel") == 0) {
  70. return arg_newInt(cfg->channel - 1);
  71. } else {
  72. return NULL;
  73. }
  74. }
  75. void _network_WLAN_connect(PikaObj* self, char* ssid, char* key) {
  76. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  77. if (hal_wifi == NULL) {
  78. return;
  79. }
  80. pika_hal_WIFI_connect_config conncfg = {0};
  81. strcpy(conncfg.ssid, ssid);
  82. strcpy(conncfg.password, key);
  83. check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_CONNECT, &conncfg));
  84. return;
  85. }
  86. void _network_WLAN_connectWithBssid(PikaObj* self,
  87. char* ssid,
  88. char* key,
  89. char* bssid) {
  90. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  91. if (hal_wifi == NULL) {
  92. return;
  93. }
  94. pika_hal_WIFI_connect_config conncfg = {0};
  95. strcpy(conncfg.ssid, ssid);
  96. strcpy(conncfg.password, key);
  97. strcpy(conncfg.bssid, bssid);
  98. check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_CONNECT, &conncfg));
  99. }
  100. void _network_WLAN_disconnect(PikaObj* self) {
  101. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  102. if (hal_wifi == NULL) {
  103. return;
  104. }
  105. check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_DISCONNECT));
  106. }
  107. int _network_WLAN_status(PikaObj* self) {
  108. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  109. if (hal_wifi == NULL) {
  110. return -1;
  111. }
  112. PIKA_HAL_WIFI_STATUS status = 0;
  113. check_res(
  114. pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_GET_STATUS, &status));
  115. return status;
  116. }
  117. int _network_WLAN_isconnected(PikaObj* self) {
  118. if (_network_WLAN_status(self) == PIKA_HAL_WIFI_STATUS_GOT_IP) {
  119. return 1;
  120. } else {
  121. return 0;
  122. }
  123. }
  124. int _network_WLAN_statusWithParam(PikaObj* self, char* param) {
  125. return _network_WLAN_status(self);
  126. }
  127. PikaObj* _network_WLAN_checkIfconfig(PikaObj* self) {
  128. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  129. if (hal_wifi == NULL) {
  130. return NULL;
  131. }
  132. pika_hal_WIFI_ifconfig ifconfig = {0};
  133. check_res(
  134. pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_GET_IFCONFIG, &ifconfig));
  135. PikaObj* ifconfig_list = newNormalObj(New_PikaStdData_List);
  136. PikaStdData_List___init__(ifconfig_list);
  137. Arg* arg = arg_newStr(ifconfig.ip);
  138. PikaStdData_List_append(ifconfig_list, arg);
  139. arg_deinit(arg);
  140. arg = arg_newStr(ifconfig.netmask);
  141. PikaStdData_List_append(ifconfig_list, arg);
  142. arg_deinit(arg);
  143. arg = arg_newStr(ifconfig.gateway);
  144. PikaStdData_List_append(ifconfig_list, arg);
  145. arg_deinit(arg);
  146. arg = arg_newStr(ifconfig.dns);
  147. PikaStdData_List_append(ifconfig_list, arg);
  148. arg_deinit(arg);
  149. return ifconfig_list;
  150. }
  151. void _network_WLAN_ifconfig(PikaObj* self,
  152. char* ip,
  153. char* mask,
  154. char* gateway,
  155. char* dns) {
  156. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  157. if (hal_wifi == NULL) {
  158. return;
  159. }
  160. pika_hal_WIFI_ifconfig ifconfig = {0};
  161. strcpy(ifconfig.ip, ip);
  162. strcpy(ifconfig.netmask, mask);
  163. strcpy(ifconfig.gateway, gateway);
  164. strcpy(ifconfig.dns, dns);
  165. check_res(
  166. pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_SET_IFCONFIG, &ifconfig));
  167. return;
  168. }
  169. PikaObj* _network_WLAN_scan(PikaObj* self) {
  170. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  171. if (hal_wifi == NULL) {
  172. return NULL;
  173. }
  174. pika_hal_WIFI_scan_result* result = NULL;
  175. check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_SCAN, &result));
  176. if (NULL == result) {
  177. return NULL;
  178. }
  179. PikaObj* scan_list = newNormalObj(New_PikaStdData_List);
  180. PikaStdData_List___init__(scan_list);
  181. for (int i = 0; i < result->count; i++) {
  182. // (ssid, bssid, channel, RSSI, authmode, hidden)
  183. PikaObj* record = newNormalObj(New_PikaStdData_Tuple);
  184. PikaStdData_Tuple___init__(record);
  185. Arg* arg = arg_newStr(result->records[i].ssid);
  186. PikaStdData_List_append(record, arg);
  187. arg_deinit(arg);
  188. arg = arg_newBytes(result->records[i].bssid,
  189. result->records[i].bssid_len);
  190. PikaStdData_List_append(record, arg);
  191. arg_deinit(arg);
  192. arg = arg_newInt(result->records[i].channel);
  193. PikaStdData_List_append(record, arg);
  194. arg_deinit(arg);
  195. arg = arg_newInt(result->records[i].rssi);
  196. PikaStdData_List_append(record, arg);
  197. arg_deinit(arg);
  198. arg = arg_newInt(result->records[i].authmode);
  199. PikaStdData_List_append(record, arg);
  200. arg_deinit(arg);
  201. arg = arg_newInt(0);
  202. PikaStdData_List_append(record, arg);
  203. arg_deinit(arg);
  204. arg = arg_newObj(record);
  205. PikaStdData_List_append(scan_list, arg);
  206. arg_deinit(arg);
  207. }
  208. pika_platform_free(result);
  209. return scan_list;
  210. }
  211. void _network_WLAN_close(PikaObj* self) {
  212. pika_dev* hal_wifi = obj_getPtr(self, "hal_wifi");
  213. if (hal_wifi == NULL) {
  214. return;
  215. }
  216. check_res(pika_hal_close(hal_wifi));
  217. }