Au passage, si d'autres que moi galèrent pour configurer le wifi sur un AllOne avec Android, j'ai trouvé comment faire les réglages du premier coup très facilement depuis un PC sous linux en wifi:
Je me suis basé sur cette article:
http://wp.bizoir.dk/?p=73
Et le code du coup (avec annotations):
Code : Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
// http://wp.bizoir.dk/?p=73
// http://stackoverflow.com/questions/30849655/linux-sendto-implementation-possibly-adding-extra-padding-to-udp-message
// Compile
// change MY_OWN_SSID and MY_OWN_SECRET_PASSWORD (can also change AES to TKIP)
// then use gcc to compile
// gcc -g -O0 -o orvibo orvibo.c
// How to use
// put Orvibo in pairing mode (press button till led blinks in blue)
// then connect wifi to wiwo-allone SSID (beware to also disconnect ethernet if present)
// launch the program to send in UDP the settings
// ./orvibo
static const int SRC_PORT = 48899;
static const int PLUG_PORT = 48899;
static const char *network_config_init = "HF-A11ASSISTHREAD";
static const char *ack = "+ok";
static const char *ssid = "AT+WSSSID=MY_OWN_SSID\r";
static const char *sec_settings = "AT+WSKEY=WPA2PSK,AES,MY_OWN_SECRET_PASSWORD\r";
static const char *station_mode = "AT+WMODE=STA\r";
static const char *reboot = "AT+Z\r";
static char plug_ip_address[16];
static int m_send_socket;
void send_broadcast_message(){
printf("message to be sent: %s\n",network_config_init);
struct sockaddr_in remote;
memset((char *)&remote, 0,sizeof(remote));
remote.sin_family = AF_INET;
remote.sin_port = htons(PLUG_PORT);
remote.sin_addr.s_addr = INADDR_BROADCAST;//htonl(INADDR_BROADCAST);
int config_length = strlen(network_config_init);
sendto(m_send_socket, network_config_init,strlen(network_config_init),0,(struct sockaddr *)&remote,sizeof(struct sockaddr_in));
}
void send_message(const char *message){
printf("message to be sent: %s\n",message);
struct sockaddr_in remote;
memset((char *)&remote, 0,sizeof(remote));
remote.sin_family = AF_INET;
remote.sin_port = htons(PLUG_PORT);
remote.sin_addr.s_addr = inet_addr(plug_ip_address);//INADDR_HF-A11ASSISTHREADBROADCAST;//htonl(INADDR_BROADCAST);
sendto(m_send_socket, message,strlen(message),0,(struct sockaddr *)&remote,sizeof(struct sockaddr_in));
}
char *receive_message(char *received_message_buffer, int buf_len){
struct sockaddr_in sender;
memset((char *)&sender, 0,sizeof(sender));
sender.sin_family = AF_INET;
sender.sin_port = htons(PLUG_PORT);
sender.sin_addr.s_addr = htonl(INADDR_ANY);
unsigned int sender_size = sizeof(sender);
assert(sizeof(*received_message_buffer) != 1024);
printf("waiting for reply:\n");
ssize_t cnt = 0;
while (1) {
memset(received_message_buffer, 0, buf_len);
cnt = recvfrom(m_send_socket, received_message_buffer, buf_len, 0, (struct sockaddr*)&sender,&sender_size);
printf("receive result: %ld-%s\n", cnt, received_message_buffer);
if (strcmp(received_message_buffer, network_config_init) == 0)
continue;
break;
}
return received_message_buffer;
}
int main(int argc , char *argv[]) {
struct sockaddr_in addr, srcaddr;
char reply[1024];
if((m_send_socket = socket(AF_INET , SOCK_DGRAM , 0 )) == -1) {
printf("Could not create send socket\n : %d",m_send_socket);
}
int broadcastEnabled=1;
setsockopt(m_send_socket, SOL_SOCKET, SO_BROADCAST, (char *)&broadcastEnabled, sizeof(broadcastEnabled));
memset(&srcaddr, 0, sizeof(srcaddr));
srcaddr.sin_family = AF_INET;
srcaddr.sin_addr.s_addr = htonl(INADDR_ANY);
srcaddr.sin_port = htons(SRC_PORT);
if (bind(m_send_socket, (struct sockaddr *) &srcaddr, sizeof(srcaddr)) < 0) {
perror("bind");
exit(1);
}
//scan for plugs
send_broadcast_message();
//get result from listening plugs
receive_message(reply, sizeof(reply));
//get ip address of plug that replied
memset((char *)&plug_ip_address, 0, sizeof(plug_ip_address));
int i = 0;
while(reply[i] != ','){
plug_ip_address[i] = reply[i];
i++;
}
//acknowledge connection to plug
send_message(ack);
//send SSID of the access point to be connected to
send_message(ssid);
receive_message(reply, sizeof(reply));
//send security details of the access point to be connected to
send_message(sec_settings);
//set the plug back to station mode
send_message(station_mode);
receive_message(reply, sizeof(reply));
//reboot the plug; it should connect to the given access point after it has booted.
send_message(reboot);
close(m_send_socket);
return 0;
}
cordialement!