_network_WLAN.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "_network_WLAN.h"
  2. #include "_network_NET.h"
  3. #include "../pikascript-lib/PikaStdDevice/pika_hal.h"
  4. #include "PikaStdData_List.h"
  5. #include "PikaStdData_Tuple.h"
  6. #include "_network_common.h"
  7. void _network_WLAN___init__(PikaObj* self, int interface_id) {
  8. pika_dev* hal_wifi = pika_hal_open(PIKA_HAL_WIFI, "WLAN0");
  9. if (hal_wifi == NULL) {
  10. return;
  11. }
  12. pika_hal_WIFI_config cfg = {0};
  13. cfg.mode = interface_id;
  14. _net_check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_CONFIG, &cfg));
  15. obj_setPtr(self, "hal_dev", hal_wifi);
  16. }
  17. void _network_WLAN_connect(PikaObj* self, char* ssid, char* key) {
  18. pika_dev* hal_wifi = _NET_OBJ_2DEV(self);
  19. if (hal_wifi == NULL) {
  20. return;
  21. }
  22. pika_hal_WIFI_connect_config conncfg = {0};
  23. strcpy(conncfg.ssid, ssid);
  24. strcpy(conncfg.password, key);
  25. _net_check_res(
  26. pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_CONNECT, &conncfg));
  27. return;
  28. }
  29. void _network_WLAN_connectWithBssid(PikaObj* self,
  30. char* ssid,
  31. char* key,
  32. char* bssid) {
  33. pika_dev* hal_wifi = _NET_OBJ_2DEV(self);
  34. if (hal_wifi == NULL) {
  35. return;
  36. }
  37. pika_hal_WIFI_connect_config conncfg = {0};
  38. strcpy(conncfg.ssid, ssid);
  39. strcpy(conncfg.password, key);
  40. strcpy(conncfg.bssid, bssid);
  41. _net_check_res(
  42. pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_CONNECT, &conncfg));
  43. }
  44. void _network_WLAN_disconnect(PikaObj* self) {
  45. pika_dev* hal_wifi = _NET_OBJ_2DEV(self);
  46. if (hal_wifi == NULL) {
  47. return;
  48. }
  49. _net_check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_DISCONNECT));
  50. }
  51. int _network_WLAN_isconnected(PikaObj* self) {
  52. if (_network_NET_status(self) == PIKA_HAL_WIFI_STATUS_GOT_IP) {
  53. return 1;
  54. } else {
  55. return 0;
  56. }
  57. }
  58. PikaObj* _network_WLAN_scan(PikaObj* self) {
  59. pika_dev* hal_wifi = _NET_OBJ_2DEV(self);
  60. if (hal_wifi == NULL) {
  61. return NULL;
  62. }
  63. pika_hal_WIFI_scan_result* result = NULL;
  64. _net_check_res(pika_hal_ioctl(hal_wifi, PIKA_HAL_IOCTL_WIFI_SCAN, &result));
  65. if (NULL == result) {
  66. return NULL;
  67. }
  68. PikaObj* scan_list = newNormalObj(New_PikaStdData_List);
  69. PikaStdData_List___init__(scan_list);
  70. for (int i = 0; i < result->count; i++) {
  71. // (ssid, bssid, channel, RSSI, authmode, hidden)
  72. PikaObj* record = newNormalObj(New_PikaStdData_Tuple);
  73. PikaStdData_Tuple___init__(record);
  74. Arg* arg = arg_newStr(result->records[i].ssid);
  75. PikaStdData_List_append(record, arg);
  76. arg_deinit(arg);
  77. arg = arg_newBytes(result->records[i].bssid,
  78. result->records[i].bssid_len);
  79. PikaStdData_List_append(record, arg);
  80. arg_deinit(arg);
  81. arg = arg_newInt(result->records[i].channel);
  82. PikaStdData_List_append(record, arg);
  83. arg_deinit(arg);
  84. arg = arg_newInt(result->records[i].rssi);
  85. PikaStdData_List_append(record, arg);
  86. arg_deinit(arg);
  87. arg = arg_newInt(result->records[i].authmode);
  88. PikaStdData_List_append(record, arg);
  89. arg_deinit(arg);
  90. arg = arg_newInt(0);
  91. PikaStdData_List_append(record, arg);
  92. arg_deinit(arg);
  93. arg = arg_newObj(record);
  94. PikaStdData_List_append(scan_list, arg);
  95. arg_deinit(arg);
  96. }
  97. pika_platform_free(result);
  98. return scan_list;
  99. }
  100. void _network_WLAN_config(PikaObj* self, PikaDict* kwargs) {
  101. pika_dev* hal_net = _NET_OBJ_2DEV(self);
  102. if (hal_net == NULL) {
  103. return;
  104. }
  105. pika_hal_WIFI_config cfg = {0};
  106. if (pikaDict_isArgExist(kwargs, "ssid")) {
  107. strcpy(cfg.ap_ssid, pikaDict_getStr(kwargs, "ssid"));
  108. }
  109. if (pikaDict_isArgExist(kwargs, "password")) {
  110. strcpy(cfg.ap_password, pikaDict_getStr(kwargs, "password"));
  111. }
  112. if (pikaDict_isArgExist(kwargs, "channel")) {
  113. cfg.channel = pikaDict_getInt(kwargs, "channel") + 1;
  114. }
  115. _net_check_res(pika_hal_ioctl(hal_net, PIKA_HAL_IOCTL_CONFIG, &cfg));
  116. }
  117. Arg* _network_WLAN_checkConfig(PikaObj* self, char* param) {
  118. pika_dev* hal_net = _NET_OBJ_2DEV(self);
  119. if (hal_net == NULL) {
  120. return NULL;
  121. }
  122. pika_hal_WIFI_config* cfg = hal_net->ioctl_config;
  123. if (strcmp(param, "ssid") == 0) {
  124. return arg_newStr(cfg->ap_ssid);
  125. } else if (strcmp(param, "password") == 0) {
  126. return arg_newStr(cfg->ap_password);
  127. } else if (strcmp(param, "channel") == 0) {
  128. return arg_newInt(cfg->channel - 1);
  129. } else {
  130. return NULL;
  131. }
  132. }