blinker + 天猫 + arduino dlna 投屏-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1152|回复: 5

[分享] blinker + 天猫 + arduino dlna 投屏

[复制链接]
发表于 2020-12-3 16:43 | 显示全部楼层 |阅读模式
第一次发帖;怎么不能设置求助&分享啊;
dlna部分功能没问题;
http_send();可以投屏推送网络地址给电视机和本地的爱奇艺万能联播;
但是,使用blinker遇到了各种各样的问题,,,
譬如:
[41271] Freeheap: 1280
16:29:57.069 -> [41273] isJson: {"data":{"state":"online"},"fromDevice":"6503990CFUGZS3Q42CPIB1EA","toDevice":"6503990d287311ebb5da5254","deviceType":"OwnApp"}
16:29:57.103 -> [41286] ERROR: Print data is not Json! {"data":{"state":"online"},"fromDevice":"6503990CFUGZS3Q42CPIB1EA","toDevice":"6503990d287311ebb5da5254","deviceType":"OwnApp"}
16:29:57.103 -> [41300] Freeheap: 2320
16:29:57.103 -> [41302] heartBeat isParsed
16:29:57.103 -> [41305] checkNum count: 1
16:29:57.103 -> [41307] isParsed

他自己发包,居然说设备在线,不是json格式,,,无语。。。
慢慢琢磨,如果有进展,还会继续更新;
也请大神help;
理想的目标就是
天猫精灵,客厅的灯红色,播放汪汪队;
天猫精灵,客厅的灯蓝色,播放猪猪侠;
努力ing。。。。



Desktop.rar

4.22 KB, 下载次数: 3

 楼主| 发表于 2020-12-3 20:16 | 显示全部楼层
怎么没人理呀,,粘点源代码
#ifndef ESP8266SSDP_H
#define ESP8266SSDP_H

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
class UdpContext;

class SSDPClass{
  public:
    SSDPClass();
    ~SSDPClass();
    bool begin();
    void end();       
        void update();
        void send();       
        void http_send();
        bool _havetv;       
       
  protected:  
        char tuuid[60];       
    UdpContext* _server;
        //WiFiClientSecure httpclient;
        //HTTPClient http;
  
    uint16_t _port;

    IPAddress _respondToAddr;
    uint16_t  _respondToPort;
       
        IPAddress _remoteAddr;
    uint16_t  _remotePort;       

    bool _pending;         
};

#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SSDP)
extern SSDPClass SSDP;
#endif

#endif
 楼主| 发表于 2020-12-3 20:17 | 显示全部楼层
#ifndef LWIP_OPEN_SRC
#define LWIP_OPEN_SRC
#endif
#include <functional>
#include "ESP8266SSDP.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h> // http ->tcp
#include "WiFiUdp.h"
#include "debug.h"
#include <WiFiClientSecure.h>

extern "C" {
#include "osapi.h"
#include "ets_sys.h"
#include "user_interface.h"
}

#include "lwip/opt.h"
#include "lwip/udp.h"
#include "lwip/inet.h"
#include "lwip/igmp.h"
#include "lwip/mem.h"
#include "include/UdpContext.h"
#define DEBUG_SSDP  Serial


#define SSDP_PORT         1900
#define SSDP_BUFFER_SIZE  64


#define SSDP_MULTICAST_ADDR 239, 255, 255, 250

static const char _ssdp_response_template[] PROGMEM =
  "HTTP/1.1 200 OK\r\n"
  "EXT:\r\n";
  
static const char _dlna_tcpsend_template[] PROGMEM =
  "POST /AVTransport/%s/control.xml HTTP/1.1\r\n"
  "HOST: %s:%d\r\n"
  "CONTENT-LENGTH: %d\r\n"  
  "CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n"
  "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#%s\"\r\n"
  "USER-AGENT: Linux/3.3.0, UPnP/1.0, libupnp/1.6.19\r\n"
  "\r\n";


static const char _ssdp_search_template[] PROGMEM =
  "M-SEARCH * HTTP/1.1\r\n"
  "User-Agent: E:\mypy\dlna.py/0.15\r\n"
  "HOST: 239.255.255.250:1900\r\n"
  "Accept: */*\r\n"
  "MAN: \"ssdp:discover\"\r\n"
  "ST: %s\r\n"
  "MX: 3\r\n"
  "\r\n";

static const char  _dlna_action_template[] PROGMEM =
  "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n"
  "<s:Body><u:%s xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\">\r\n"
  "<InstanceID>0</InstanceID>\r\n"
  "<Speed>1</Speed>\r\n"
  "</u:%s>\r\n"
  "</s:Body>\r\n"
  "</s:Envelope>\r\n";
  

static const char  _dlna_playuri_template[] PROGMEM =
  "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n"
  "<s:Body><u:SetAVTransportURI xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\">\r\n"
  "<InstanceID>0</InstanceID>\r\n"
  "<CurrentURI>%s</CurrentURI>\r\n"
  "<CurrentURIMetaData>&lt;DIDL-Lite xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot;&gt;&lt;item id=&quot;123&quot; parentID=&quot;-1&quot; restricted=&quot;1&quot;&gt;&lt;upnp:storageMedium&gt;UNKNOWN&lt;/upnp:storageMedium&gt;&lt;upnp:writeStatus&gt;UNKNOWN&lt;/upnp:writeStatus&gt;&lt;upnp:class&gt;object.item.videoItem&lt;/upnp:class&gt;&lt;dc:title&gt;....-vip.................&lt;/dc:title&gt;&lt;dc:creator&gt;youku&lt;/dc:creator&gt;&lt;res protocolInfo=&quot;http-get:*:video/mp4:*;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01700000000000000000000000000000&quot;&gt;%s&lt;/res&gt;&lt;yunos os=&quot;android&quot; ver=&quot;4.5.1.151&quot; name=&quot;......&quot; pkg=&quot;com.quark.browser&quot; proj_mode=&quot;NORMAL_2&quot; yk_vid=&quot;16062670667400001&quot; yk_showtitle=&quot;NULL&quot; yk_showid=&quot;NULL&quot; duration=&quot;37245330&quot; startpos=&quot;0&quot; definition=&quot;NULL&quot; /&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;</CurrentURIMetaData>\r\n"
  "</u:SetAVTransportURI>\r\n"
  "</s:Body>\r\n"
  "</s:Envelope>\r\n";
  


SSDPClass::SSDPClass(){
  _port=80;
  _pending=false;  
}
  
SSDPClass::~SSDPClass() {
  end();
}

bool SSDPClass::begin() {
  end();       
  _server = new UdpContext;
  _server->ref();
  

  IPAddress local = WiFi.localIP();
  IPAddress mcast(SSDP_MULTICAST_ADDR);
  if (igmp_joingroup(local, mcast) != ERR_OK ) {
#ifdef DEBUG_SSDP
    DEBUG_SSDP.printf_P(PSTR("SSDP failed to join igmp group\n"));
#endif
    return false;
  }
  if (!_server->listen(IP_ADDR_ANY, SSDP_PORT)) {
    return false;
  }

  _server->setMulticastInterface(local);
  _server->setMulticastTTL(2);
  _server->onRx(std::bind(&SSDPClass::update, this));
  if (!_server->connect(mcast, SSDP_PORT)) {
    return false;
  }
  return true;
}

void SSDPClass::end() {
  if(!_server)
    return;
  _server->disconnect();

  IPAddress local = WiFi.localIP();
  IPAddress mcast(SSDP_MULTICAST_ADDR);
  _server->unref();
  _server = 0;
}


void SSDPClass::update() {               
  if (!_pending && _server->next()) {       
    uint8_t cursor = 0;
    uint8_t cr = 0;               
        char buffer[255] = {0};
        bool location = false;       
        bool server = false ;       
        bool uuid= false ;
        char ip[4];
        uint8_t ip1;
        uint8_t ip2;
        uint8_t ip3;
        uint8_t ip4;
        char ipport[5];       
       
    while (_server->getSize() > 0) {               
        char c = _server->read();               
                if(strcasecmp(buffer,"serv") == 0){       
                        cursor=0;
                        do{
                                c = _server->read();                               
                        }while(c != ' ');
                               
                        do{
                                c = _server->read();                               
                                buffer[cursor++] = c;
                                buffer[cursor] ='\0';
                        }while( c != '\r' && c != '\n' );
                       
                        for(int i=0;i<strlen(buffer);i++){
                                buffer[i] = tolower(buffer[i]);
                        }
                        if (strstr(buffer,"dlna") > 0){
                                server = true;
                        }                       
                }
               
                if(strcasecmp(buffer,"Loca") == 0){
                        cursor=0;
                        do{
                                c = _server->read();                               
                        }while(c != ' ');
                               
                        do{
                                c = _server->read();                               
                                buffer[cursor++] = c;
                                buffer[cursor] ='\0';
                        }while( c != '\r' && c != '\n' );
                       
                        int j=7;
                        int k;                       
                        do{                               
                                ip[j-7] = buffer[j];
                                ip[j-6] = '\0';
                                j++;                               
                        }while(buffer[j] !='.');                       
                        ip1 = atoi(ip);
                        j++;
                        k = j;
                        do{                               
                                ip[j-k] = buffer[j];
                                ip[j-k+1] ='\0';
                                j++;                               
                        }while(buffer[j] !='.' );
                        ip2 = atoi(ip);
                        j++;
                        k = j;
                        do{                               
                                ip[j-k] = buffer[j];
                                ip[j-k+1] ='\0';
                                j++;                               
                        }while(buffer[j] !='.' );
                        ip3 = atoi(ip);
                        j++;
                        k = j;
                        do{                               
                                ip[j-k] = buffer[j];
                                ip[j-k+1] ='\0';
                                j++;                               
                        }while(buffer[j] !=':' );
                        ip4 = atoi(ip);
                       
                        j++;
                        k = j;
                        do{                               
                                ipport[j-k] = buffer[j];
                                ipport[j-k+1] ='\0';
                                j++;                               
                        }while(buffer[j] !='/' && j < strlen(buffer) );                       
                        _remoteAddr = IPAddress(ip1,ip2,ip3,ip4);
                        _remotePort = atoi(ipport);
                        location= true;
                }
               
                if(strncmp("USN:",buffer,4)==0){
                        cursor=0;
                        do{
                                c = _server->read();                               
                        }while(c != ' ');
                               
                        do{
                                c = _server->read();                               
                                buffer[cursor++] = c;
                                buffer[cursor] ='\0';
                        }while( c != '\r' && c != '\n');                       
                        char fuuid[4];
                        fuuid[0] = buffer[0];
                        fuuid[1] = buffer[1];
                        fuuid[2] = buffer[2];
                        fuuid[3] = buffer[3];
                        fuuid[4] = '\0';                       
                       
                        if (strcasecmp(fuuid,"uuid")==0){                               
                                for( int a = 0; a < 60; a =a +1 ){                                       
                                        if (buffer[5+a] != ':' && buffer[5+a] != '\r' && buffer[5+a] != '\n' ){                                               
                                                tuuid[a] =  buffer[5+a];
                                        }else{
                                                tuuid[a] = '\0';
                                        }
                                }
                                uuid=true;                                  
                        }
                       
                };
                       
                if(cursor < 4){
                        buffer[cursor++] = c;
                        buffer[cursor] = '\0';                                       
                }
                if(c=='\r' || c=='\n'){
                        cursor = 0;
                }
               
                if (uuid && server && location){               
                        _pending = true;
                        _havetv = true;
                        DEBUG_SSDP.printf("location:%d,%d,%d,%d\r\n",ip1,ip2,ip3,ip4);
                        DEBUG_SSDP.printf("uuid:%s\r\n",(char*)tuuid);
                }

        }   
    //_server->flush();   

}
  if (_pending) {
    while (_server->next())
      _server->flush();
  }
}

void SSDPClass::http_send(){       
        DEBUG_SSDP.printf("???");       
        WiFiClient clients;
        if (!clients.connect(_remoteAddr,_remotePort)) {   // 判断连接情况
    DEBUG_SSDP.print("connection failed/r/n");
    return;
        }
        char bui[2000];
        char bu[640];   
        int len;
       
        //停止       
        len = snprintf_P(bui, sizeof(bui),
                        _dlna_action_template,
                                                "Stop",
                                                "Stop"  
                      );
       
       
        len = snprintf_P(bu, sizeof(bu),
                        _dlna_tcpsend_template,
                                                tuuid,
                                                _remoteAddr.toString().c_str(),
                                                _remotePort,
                                                len,
                                                "Stop"
                      );       
        clients.print(bu);
        clients.print(bui);
       
        //uri
        len = snprintf_P(bui, sizeof(bui),
                        _dlna_playuri_template,
                                                "https://youku.com-t-youku.com/20190325/10676_9a90c151/index.m3u8?dlnaopt=2&amp;tpseq=1",
                                                "https://youku.com-t-youku.com/20190325/10676_9a90c151/index.m3u8?dlnaopt=2&amp;tpseq=1"   
                      );
       
       
        len = snprintf_P(bu, sizeof(bu),
                        _dlna_tcpsend_template,
                                                tuuid,
                                                _remoteAddr.toString().c_str(),
                                                _remotePort,
                                                len,
                                                "SetAVTransportURI"
                      );       
        clients.print(bu);
        clients.print(bui);       
    //播放
        len = snprintf_P(bui, sizeof(bui),
                        _dlna_action_template,
                                                "Play",
                                                "Play"   
                      );
       
       
        len = snprintf_P(bu, sizeof(bu),
                        _dlna_tcpsend_template,
                                                tuuid,
                                                _remoteAddr.toString().c_str(),
                                                _remotePort,
                                                len,
                                                "Play"
                      );       
        clients.print(bu);
        clients.print(bui);
       
               
       
        DEBUG_SSDP.print("运行完了,去看看");
        DEBUG_SSDP.print("\r\n");
       
  
}

void SSDPClass::send() {       
  DEBUG_SSDP.print("寻找.....\r\n");
  char buffer[1460];
  IPAddress ip = WiFi.localIP();
  
  IPAddress remoteAddr;
  uint16_t remotePort;
  remoteAddr = IPAddress(SSDP_MULTICAST_ADDR);
  remotePort = SSDP_PORT;
  
  int len = snprintf_P(buffer, sizeof(buffer),
                       _ssdp_search_template,
                                          "ssdp:all"
                      );

  _server->append(buffer, len);
  _server->send(remoteAddr, remotePort);
  
  len = snprintf_P(buffer, sizeof(buffer),
                       _ssdp_search_template,
                                          "urn:schemas-upnp-org:device:AVTransport:1"
                      );

  _server->append(buffer, len);
  _server->send(remoteAddr, remotePort);
  
  len = snprintf_P(buffer, sizeof(buffer),
                       _ssdp_search_template,
                                          "urn:schemas-upnp-org:device:MediaRenderer:1"
                      );

  _server->append(buffer, len);
  _server->send(remoteAddr, remotePort);

  len = snprintf_P(buffer, sizeof(buffer),
                       _ssdp_search_template,
                                          "urn:schemas-upnp-org:device:MediaServer:1"
                      );

  _server->append(buffer, len);
  _server->send(remoteAddr, remotePort);  
  
  
}






#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SSDP)
SSDPClass SSDP;
#endif
 楼主| 发表于 2020-12-3 20:17 | 显示全部楼层
这里是ino的源码
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_ALIGENIE_LIGHT
#include <Blinker.h>
#include <ESP8266SSDP.h>

char auth[] = "50097bd50d7b";
char ssid[] = "zhzx";
char pswd[] = "119119119";
BlinkerButton Button1("btn-abc");

void button1_callback(const String & state) {  
    if(SSDP._havetv){
      Blinker.print("havetv");
    }else{
      Blinker.print("non-tv");
    }   
}

void aligenieColor(const String & color)
{
    BLINKER_LOG("need set color: ", color);

    if (color == "Red") {
        SSDP.http_send();
    }
    else if (color == "Yellow") {
        SSDP.http_send();
    }
    else if (color == "Blue") {
        SSDP.http_send();
    }
    else if (color == "Green") {
        SSDP.http_send();
    }
    else if (color == "White") {
       SSDP.http_send();
    }
    else if (color == "Black") {
       SSDP.http_send();
    }
    else if (color == "Cyan") {
        SSDP.http_send();
    }
    else if (color == "Purple") {
       SSDP.http_send();
    }
    else if (color == "Orange") {
       SSDP.http_send();
    }

    BlinkerAliGenie.color(color);
    BlinkerAliGenie.print();
}
void heartbeat()//心跳包
{
     if (!SSDP._havetv){
      SSDP.send();     
    }   
}

void setup() {  
    Serial.begin(115200);   
    Blinker.begin(auth, ssid, pswd);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    BlinkerAliGenie.attachColor(aligenieColor);
    extern BearSSL::WiFiClientSecure client_mqtt;
    client_mqtt.stop();
    Blinker.attachHeartbeat(heartbeat);
    Button1.attach(button1_callback);      
    if (WiFi.waitForConnectResult() == WL_CONNECTED) {
      SSDP.begin();
    }else{
      Serial.printf("WiFi Failed\n");
    }
   
}

void loop() {
    Blinker.run();   
}
 楼主| 发表于 2020-12-3 20:18 | 显示全部楼层
cpp源代码
#ifndef LWIP_OPEN_SRC
#define LWIP_OPEN_SRC
#endif
#include <functional>
#include "ESP8266SSDP.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h> // http ->tcp
#include "WiFiUdp.h"
#include "debug.h"
#include <WiFiClientSecure.h>

extern "C" {
#include "osapi.h"
#include "ets_sys.h"
#include "user_interface.h"
}

#include "lwip/opt.h"
#include "lwip/udp.h"
#include "lwip/inet.h"
#include "lwip/igmp.h"
#include "lwip/mem.h"
#include "include/UdpContext.h"
#define DEBUG_SSDP  Serial


#define SSDP_PORT         1900
#define SSDP_BUFFER_SIZE  64


#define SSDP_MULTICAST_ADDR 239, 255, 255, 250

static const char _ssdp_response_template[] PROGMEM =
  "HTTP/1.1 200 OK\r\n"
  "EXT:\r\n";
  
static const char _dlna_tcpsend_template[] PROGMEM =
  "POST /AVTransport/%s/control.xml HTTP/1.1\r\n"
  "HOST: %s:%d\r\n"
  "CONTENT-LENGTH: %d\r\n"  
  "CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n"
  "SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#%s\"\r\n"
  "USER-AGENT: Linux/3.3.0, UPnP/1.0, libupnp/1.6.19\r\n"
  "\r\n";


static const char _ssdp_search_template[] PROGMEM =
  "M-SEARCH * HTTP/1.1\r\n"
  "User-Agent: E:\mypy\dlna.py/0.15\r\n"
  "HOST: 239.255.255.250:1900\r\n"
  "Accept: */*\r\n"
  "MAN: \"ssdp:discover\"\r\n"
  "ST: %s\r\n"
  "MX: 3\r\n"
  "\r\n";

static const char  _dlna_action_template[] PROGMEM =
  "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n"
  "<s:Body><u:%s xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\">\r\n"
  "<InstanceID>0</InstanceID>\r\n"
  "<Speed>1</Speed>\r\n"
  "</u:%s>\r\n"
  "</s:Body>\r\n"
  "</s:Envelope>\r\n";
  

static const char  _dlna_playuri_template[] PROGMEM =
  "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n"
  "<s:Body><u:SetAVTransportURI xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\">\r\n"
  "<InstanceID>0</InstanceID>\r\n"
  "<CurrentURI>%s</CurrentURI>\r\n"
  "<CurrentURIMetaData>&lt;DIDL-Lite xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot;&gt;&lt;item id=&quot;123&quot; parentID=&quot;-1&quot; restricted=&quot;1&quot;&gt;&lt;upnp:storageMedium&gt;UNKNOWN&lt;/upnp:storageMedium&gt;&lt;upnp:writeStatus&gt;UNKNOWN&lt;/upnp:writeStatus&gt;&lt;upnp:class&gt;object.item.videoItem&lt;/upnp:class&gt;&lt;dc:title&gt;....-vip.................&lt;/dc:title&gt;&lt;dc:creator&gt;youku&lt;/dc:creator&gt;&lt;res protocolInfo=&quot;http-get:*:video/mp4:*;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01700000000000000000000000000000&quot;&gt;%s&lt;/res&gt;&lt;yunos os=&quot;android&quot; ver=&quot;4.5.1.151&quot; name=&quot;......&quot; pkg=&quot;com.quark.browser&quot; proj_mode=&quot;NORMAL_2&quot; yk_vid=&quot;16062670667400001&quot; yk_showtitle=&quot;NULL&quot; yk_showid=&quot;NULL&quot; duration=&quot;37245330&quot; startpos=&quot;0&quot; definition=&quot;NULL&quot; /&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;</CurrentURIMetaData>\r\n"
  "</u:SetAVTransportURI>\r\n"
  "</s:Body>\r\n"
  "</s:Envelope>\r\n";
  


SSDPClass::SSDPClass(){
  _port=80;
  _pending=false;  
}
  
SSDPClass::~SSDPClass() {
  end();
}

bool SSDPClass::begin() {
  end();       
  _server = new UdpContext;
  _server->ref();
  

  IPAddress local = WiFi.localIP();
  IPAddress mcast(SSDP_MULTICAST_ADDR);
  if (igmp_joingroup(local, mcast) != ERR_OK ) {
#ifdef DEBUG_SSDP
    DEBUG_SSDP.printf_P(PSTR("SSDP failed to join igmp group\n"));
#endif
    return false;
  }
  if (!_server->listen(IP_ADDR_ANY, SSDP_PORT)) {
    return false;
  }

  _server->setMulticastInterface(local);
  _server->setMulticastTTL(2);
  _server->onRx(std::bind(&SSDPClass::update, this));
  if (!_server->connect(mcast, SSDP_PORT)) {
    return false;
  }
  return true;
}

void SSDPClass::end() {
  if(!_server)
    return;
  _server->disconnect();

  IPAddress local = WiFi.localIP();
  IPAddress mcast(SSDP_MULTICAST_ADDR);
  _server->unref();
  _server = 0;
}


void SSDPClass::update() {               
  if (!_pending && _server->next()) {       
    uint8_t cursor = 0;
    uint8_t cr = 0;               
        char buffer[255] = {0};
        bool location = false;       
        bool server = false ;       
        bool uuid= false ;
        char ip[4];
        uint8_t ip1;
        uint8_t ip2;
        uint8_t ip3;
        uint8_t ip4;
        char ipport[5];       
       
    while (_server->getSize() > 0) {               
        char c = _server->read();               
                if(strcasecmp(buffer,"serv") == 0){       
                        cursor=0;
                        do{
                                c = _server->read();                               
                        }while(c != ' ');
                               
                        do{
                                c = _server->read();                               
                                buffer[cursor++] = c;
                                buffer[cursor] ='\0';
                        }while( c != '\r' && c != '\n' );
                       
                        for(int i=0;i<strlen(buffer);i++){
                                buffer[i] = tolower(buffer[i]);
                        }
                        if (strstr(buffer,"dlna") > 0){
                                server = true;
                        }                       
                }
               
                if(strcasecmp(buffer,"Loca") == 0){
                        cursor=0;
                        do{
                                c = _server->read();                               
                        }while(c != ' ');
                               
                        do{
                                c = _server->read();                               
                                buffer[cursor++] = c;
                                buffer[cursor] ='\0';
                        }while( c != '\r' && c != '\n' );
                       
                        int j=7;
                        int k;                       
                        do{                               
                                ip[j-7] = buffer[j];
                                ip[j-6] = '\0';
                                j++;                               
                        }while(buffer[j] !='.');                       
                        ip1 = atoi(ip);
                        j++;
                        k = j;
                        do{                               
                                ip[j-k] = buffer[j];
                                ip[j-k+1] ='\0';
                                j++;                               
                        }while(buffer[j] !='.' );
                        ip2 = atoi(ip);
                        j++;
                        k = j;
                        do{                               
                                ip[j-k] = buffer[j];
                                ip[j-k+1] ='\0';
                                j++;                               
                        }while(buffer[j] !='.' );
                        ip3 = atoi(ip);
                        j++;
                        k = j;
                        do{                               
                                ip[j-k] = buffer[j];
                                ip[j-k+1] ='\0';
                                j++;                               
                        }while(buffer[j] !=':' );
                        ip4 = atoi(ip);
                       
                        j++;
                        k = j;
                        do{                               
                                ipport[j-k] = buffer[j];
                                ipport[j-k+1] ='\0';
                                j++;                               
                        }while(buffer[j] !='/' && j < strlen(buffer) );                       
                        _remoteAddr = IPAddress(ip1,ip2,ip3,ip4);
                        _remotePort = atoi(ipport);
                        location= true;
                }
               
                if(strncmp("USN:",buffer,4)==0){
                        cursor=0;
                        do{
                                c = _server->read();                               
                        }while(c != ' ');
                               
                        do{
                                c = _server->read();                               
                                buffer[cursor++] = c;
                                buffer[cursor] ='\0';
                        }while( c != '\r' && c != '\n');                       
                        char fuuid[4];
                        fuuid[0] = buffer[0];
                        fuuid[1] = buffer[1];
                        fuuid[2] = buffer[2];
                        fuuid[3] = buffer[3];
                        fuuid[4] = '\0';                       
                       
                        if (strcasecmp(fuuid,"uuid")==0){                               
                                for( int a = 0; a < 60; a =a +1 ){                                       
                                        if (buffer[5+a] != ':' && buffer[5+a] != '\r' && buffer[5+a] != '\n' ){                                               
                                                tuuid[a] =  buffer[5+a];
                                        }else{
                                                tuuid[a] = '\0';
                                        }
                                }
                                uuid=true;                                  
                        }
                       
                };
                       
                if(cursor < 4){
                        buffer[cursor++] = c;
                        buffer[cursor] = '\0';                                       
                }
                if(c=='\r' || c=='\n'){
                        cursor = 0;
                }
               
                if (uuid && server && location){               
                        _pending = true;
                        _havetv = true;
                        DEBUG_SSDP.printf("location:%d,%d,%d,%d\r\n",ip1,ip2,ip3,ip4);
                        DEBUG_SSDP.printf("uuid:%s\r\n",(char*)tuuid);
                }

        }   
    //_server->flush();   

}
  if (_pending) {
    while (_server->next())
      _server->flush();
  }
}

void SSDPClass::http_send(){       
        DEBUG_SSDP.printf("???");       
        WiFiClient clients;
        if (!clients.connect(_remoteAddr,_remotePort)) {   // 判断连接情况
    DEBUG_SSDP.print("connection failed/r/n");
    return;
        }
        char bui[2000];
        char bu[640];   
        int len;
       
        //停止       
        len = snprintf_P(bui, sizeof(bui),
                        _dlna_action_template,
                                                "Stop",
                                                "Stop"  
                      );
       
       
        len = snprintf_P(bu, sizeof(bu),
                        _dlna_tcpsend_template,
                                                tuuid,
                                                _remoteAddr.toString().c_str(),
                                                _remotePort,
                                                len,
                                                "Stop"
                      );       
        clients.print(bu);
        clients.print(bui);
       
        //uri
        len = snprintf_P(bui, sizeof(bui),
                        _dlna_playuri_template,
                                                "https://youku.com-t-youku.com/20190325/10676_9a90c151/index.m3u8?dlnaopt=2&amp;tpseq=1",
                                                "https://youku.com-t-youku.com/20190325/10676_9a90c151/index.m3u8?dlnaopt=2&amp;tpseq=1"   
                      );
       
       
        len = snprintf_P(bu, sizeof(bu),
                        _dlna_tcpsend_template,
                                                tuuid,
                                                _remoteAddr.toString().c_str(),
                                                _remotePort,
                                                len,
                                                "SetAVTransportURI"
                      );       
        clients.print(bu);
        clients.print(bui);       
    //播放
        len = snprintf_P(bui, sizeof(bui),
                        _dlna_action_template,
                                                "Play",
                                                "Play"   
                      );
       
       
        len = snprintf_P(bu, sizeof(bu),
                        _dlna_tcpsend_template,
                                                tuuid,
                                                _remoteAddr.toString().c_str(),
                                                _remotePort,
                                                len,
                                                "Play"
                      );       
        clients.print(bu);
        clients.print(bui);
       
               
       
        DEBUG_SSDP.print("运行完了,去看看");
        DEBUG_SSDP.print("\r\n");
       
  
}

void SSDPClass::send() {       
  DEBUG_SSDP.print("寻找.....\r\n");
  char buffer[1460];
  IPAddress ip = WiFi.localIP();
  
  IPAddress remoteAddr;
  uint16_t remotePort;
  remoteAddr = IPAddress(SSDP_MULTICAST_ADDR);
  remotePort = SSDP_PORT;
  
  int len = snprintf_P(buffer, sizeof(buffer),
                       _ssdp_search_template,
                                          "ssdp:all"
                      );

  _server->append(buffer, len);
  _server->send(remoteAddr, remotePort);
  
  len = snprintf_P(buffer, sizeof(buffer),
                       _ssdp_search_template,
                                          "urn:schemas-upnp-org:device:AVTransport:1"
                      );

  _server->append(buffer, len);
  _server->send(remoteAddr, remotePort);
  
  len = snprintf_P(buffer, sizeof(buffer),
                       _ssdp_search_template,
                                          "urn:schemas-upnp-org:device:MediaRenderer:1"
                      );

  _server->append(buffer, len);
  _server->send(remoteAddr, remotePort);

  len = snprintf_P(buffer, sizeof(buffer),
                       _ssdp_search_template,
                                          "urn:schemas-upnp-org:device:MediaServer:1"
                      );

  _server->append(buffer, len);
  _server->send(remoteAddr, remotePort);  
  
  
}






#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SSDP)
SSDPClass SSDP;
#endif
发表于 2020-12-3 21:56 | 显示全部楼层
赞个,怎不配个图
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 13:31 , Processed in 0.080702 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表