大学课程设计,编写蓝牙透传app时候,再发送一个信息蓝牙就断开连接

如题,我最近在做课程设计,题目是基于STM32的一个猫屋设计,主要是一个PWM风扇控制,和一个远程投喂功能。 再加个基于BT05的蓝牙透传APP。APP做到一半,PWM风扇做好了,但是想加个定时远程投喂加不上,思路是定时中断STM32,从而达到投喂功能。
1. 遇到的问题:APP能设置温度的上下限,读取实时温度,上下限温度。但是再想读取一个投喂间隔或者设置投喂间隔就会自动断开蓝牙连接图片说明

这是我的APP界面。就是如果读取投喂间隔或者按最后一个按钮——设置投喂间隔,就会断开蓝牙,返回扫描蓝牙界面。

请各位前辈指教。我不知道怎么修改。

下面是我的DeviceCnotrolActivity.java的代码。谢谢。

/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.bluetooth.le;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;

/**
 * For a given BLE device, this Activity provides the user interface to connect, display data,
 * and display GATT services and characteristics supported by the device.  The Activity
 * communicates with {@code BluetoothLeService}, which in turn interacts with the
 * Bluetooth LE API.
 */
public class DeviceControlActivity extends Activity {
    private final static String TAG = DeviceControlActivity.class.getSimpleName();

    public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME";
    public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";

    private TextView mConnectionState;
    private TextView mDataField;
    private TextView mDataTemptured;//显示温度
    private TextView mSetTemptured;//设置温度
    private TextView mSetLTemptured;//设置温度 下限
    private TextView mFenSuRang;//风扇档位

    private String mDeviceName;

    private String mDeviceAddress;
    private ExpandableListView mGattServicesList;
    private BluetoothLeService mBluetoothLeService;
    private ArrayList<ArrayList<BluetoothGattCharacteristic>> mGattCharacteristics =
            new ArrayList<ArrayList<BluetoothGattCharacteristic>>();
    private boolean mConnected = false;
    private BluetoothGattCharacteristic mNotifyCharacteristic;


    boolean connect_status_bit=false;

    private final String LIST_NAME = "NAME";
    private final String LIST_UUID = "UUID";
    private final String g_TitleName = "智能温度控制设计";



    private final String g_EndByte= "0E";
    private final String g_SetHADDR = "0A0B02";
    private final String g_SetLADDR = "0A0B03";
    private Handler mHandler;

    // Stops scanning after 10 seconds.
    private static final long SCAN_PERIOD = 1000;

    private int i = 0;  
    private int TIME = 1000; 


    // Code to manage Service lifecycle.
    private final ServiceConnection mServiceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder service) {
            mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();
            if (!mBluetoothLeService.initialize()) {
                Log.e(TAG, "Unable to initialize Bluetooth");
                finish();
            }
            // Automatically connects to the device upon successful start-up initialization.
            mBluetoothLeService.connect(mDeviceAddress);
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mBluetoothLeService = null;
        }
    };

    // Handles various events fired by the Service.
    // ACTION_GATT_CONNECTED: connected to a GATT server.
    // ACTION_GATT_DISCONNECTED: disconnected from a GATT server.
    // ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.
    // ACTION_DATA_AVAILABLE: received data from the device.  This can be a result of read
    //                        or notification operations.
    private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
                //mConnected = true;


                connect_status_bit=true;

                invalidateOptionsMenu();
            } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
                mConnected = false;

                updateConnectionState(R.string.disconnected);
                connect_status_bit=false;
                show_view(false);
                invalidateOptionsMenu();
                clearUI();
            } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
                // Show all the supported services and characteristics on the user interface.
                displayGattServices(mBluetoothLeService.getSupportedGattServices());
            } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
                displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));
            }
        }
    };

    // If a given GATT characteristic is selected, check for supported features.  This sample
    // demonstrates 'Read' and 'Notify' features.  See
    // http://d.android.com/reference/android/bluetooth/BluetoothGatt.html for the complete
    // list of supported characteristic features.
    private final ExpandableListView.OnChildClickListener servicesListClickListner =
            new ExpandableListView.OnChildClickListener() {
                @Override
                public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
                                            int childPosition, long id) {


                    return false;
                }
    };

    private void clearUI() {
        //mGattServicesList.setAdapter((SimpleExpandableListAdapter) null);
        mDataField.setText(R.string.no_data);
    }

    Button send_button; //发送上限温度按键
    Button send_Lowbutton; //发送下限温度按键
    Button send_feedbutton; //发送投喂按键
    Button enable_button;
    Button IBeacon_set_button;

    EditText txd_txt,uuid_1001_ed;
    EditText txd_txtLowTempture; //下限显示文本
    EditText txd_txtfeedtime; //投喂间隔显示文本
    EditText ibeacon_uuid;
    EditText mayjor_txt,minor_txt;

    EditText dev_Name;
    Button name_button;

    EditText password_ed;//密码值
    Button password_enable_bt;//密码开关
    Button password_wrt;//密码写入Button

    Button adv_time1,adv_time2,adv_time3,adv_time4;

    boolean pass_en=false;

    Button clear_button;


    private Button IO_H_button,IO_L_button;//out io
    Timer timer = new Timer();  


    void show_view( boolean p )
    {
        if(p){
            send_button.setEnabled(true);
            send_Lowbutton.setEnabled(true);
            send_feedbutton.setEnabled(true);

        }else{
            send_button.setEnabled(false);
            send_Lowbutton.setEnabled(false);
            send_feedbutton.setEnabled(false);

        }
    }

    public void delay(int ms){
        try {
            Thread.currentThread();
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } 
     }  

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gatt_services_characteristics);

        final Intent intent = getIntent();
        mDeviceName = intent.getStringExtra(EXTRAS_DEVICE_NAME);
        mDeviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS);

        // Sets up UI references.
        ((TextView) findViewById(R.id.device_address)).setText(mDeviceAddress);
        //mGattServicesList = (ExpandableListView) findViewById(R.id.gatt_services_list);
       // mGattServicesList.setOnChildClickListener(servicesListClickListner);
        mConnectionState = (TextView) findViewById(R.id.connection_state);
     //   mDataField = (TextView) findViewById(R.id.data_value);
        mDataTemptured = (TextView) findViewById(R.id.rx_Tempture);
        mSetTemptured= (TextView) findViewById(R.id.ARM_Tempture);
        mSetLTemptured= (TextView) findViewById(R.id.L_Tempture);
        mFenSuRang= (TextView) findViewById(R.id.rx_FenRang);


        send_button=(Button)findViewById(R.id.tx_SetHbutton);//send data 1002
        send_button.setOnClickListener(listener);//设置监听  

        send_Lowbutton = (Button)findViewById(R.id.tx_SetLbutton);//send data 1002
        send_Lowbutton.setOnClickListener(listener);//设置监听  

        send_feedbutton=(Button)findViewById(R.id.tx_SetFbutton);//send data 1002
        send_feedbutton.setOnClickListener(listener);//设置监听  
//        clear_button=(Button)findViewById(R.id.clear_button);//send data 1002
//        clear_button.setOnClickListener(listener);//设置监听  

        txd_txt=(EditText)findViewById(R.id.tx_text);//1002 data
        txd_txt.setText("28");

        txd_txtLowTempture=(EditText)findViewById(R.id.tx_dispLTemptuer);//1002 data
        txd_txtLowTempture.setText("15");

       // rx_data_id_1=(EditText)findViewById(R.id.rx_data_id_1);//1002 data
//        rx_data_id_1.setText("");



        show_view(false);
        mHandler = new Handler();

        timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行  

        boolean sg;
        getActionBar().setTitle(g_TitleName); //
        getActionBar().setDisplayHomeAsUpEnabled(true);
        Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);
        sg = bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
        //getActionBar().setTitle( "="+BluetoothLeService );
        //mDataField.setText("="+sg );
        updateConnectionState(R.string.connecting);//更新连接状态
    }

    Handler handler = new Handler() {  
        public void handleMessage(Message msg) {  
            if (msg.what == 1) {  
                //tvShow.setText(Integer.toString(i++));  
                //scanLeDevice(true);
                if (mBluetoothLeService != null) {
                    if( mConnected==false )
                    {
                        updateConnectionState(R.string.connecting);
                        final boolean result = mBluetoothLeService.connect(mDeviceAddress);
                        Log.d(TAG, "Connect request result=" + result);
                    }
                }
            }  
            super.handleMessage(msg);  
        };  
    };  
    TimerTask task = new TimerTask() {  

        @Override  
        public void run() {  
            // 需要做的事:发送消息  
            Message message = new Message();  
            message.what = 1;  
            handler.sendMessage(message);  
        }  
    }; 




    Button.OnClickListener listener = new Button.OnClickListener(){//创建监听对象    
        public void onClick(View v){    
            //String strTmp="点击Button02";    
            //Ev1.setText(strTmp);   
            switch( v.getId())
            {
                    case R.id.tx_SetHbutton ://uuid1002 数传通道发送数据 设置上限按钮
                        if( connect_status_bit )
                      {
                            String tx_string=txd_txt.getText().toString().trim(); //去掉有空格
                            mBluetoothLeService.txxx(g_SetHADDR+tx_string+g_EndByte);


                      }else{
                          //Toast.makeText(this, "Deleted Successfully!", Toast.LENGTH_LONG).show(); 
                          Toast toast = Toast.makeText(DeviceControlActivity.this, "设备没有连接!", Toast.LENGTH_SHORT); 
                          toast.show(); 
                      }
                     break;

                    case R.id.tx_SetLbutton ://uuid1002 数传通道发送数据  设置下限按钮
                        if( connect_status_bit )
                      {
                            String tx_string=txd_txtLowTempture.getText().toString().trim(); //去掉有空格
                            mBluetoothLeService.txxx(g_SetLADDR+tx_string+g_EndByte);


                      }else{
                          //Toast.makeText(this, "Deleted Successfully!", Toast.LENGTH_LONG).show(); 
                          Toast toast = Toast.makeText(DeviceControlActivity.this, "设备没有连接!", Toast.LENGTH_SHORT); 
                          toast.show(); 
                      }
                     break;          
                     case R.id.tx_SetFbutton ://uuid1002 数传通道发送数据 设置上限按钮
                            if( connect_status_bit )
                                  {
                                        String tx_string=txd_txtfeedtime.getText().toString().trim(); //去掉有空格
                                        mBluetoothLeService.txxx(g_SetHADDR+tx_string+g_EndByte);


                                  }else{
                                      //Toast.makeText(this, "Deleted Successfully!", Toast.LENGTH_LONG).show(); 
                                      Toast toast = Toast.makeText(DeviceControlActivity.this, "设备没有连接!", Toast.LENGTH_SHORT); 
                                      toast.show(); 
                                  }
                                 break;
//          case R.id.clear_button:
//          {
////                len_g =0;
////                da = "";
////                rx_data_id_1.setText( da );
////                mDataField.setText( ""+len_g );
//          }break;

                default :
                    break;
            }
        }    

    };  
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
        if (mBluetoothLeService != null) {

            final boolean result = mBluetoothLeService.connect(mDeviceAddress);
            Log.d(TAG, "Connect request result=" + result);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mGattUpdateReceiver);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(mServiceConnection);
        mBluetoothLeService = null;
        timer.cancel();
        timer=null;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.gatt_services, menu);
        if (mConnected) {
            menu.findItem(R.id.menu_connect).setVisible(false);
            menu.findItem(R.id.menu_disconnect).setVisible(true);
        } else {
            menu.findItem(R.id.menu_connect).setVisible(true);
            menu.findItem(R.id.menu_disconnect).setVisible(false);
        }
        return true;
    } 

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.menu_connect:
                mBluetoothLeService.connect(mDeviceAddress);
                return true;
            case R.id.menu_disconnect:
                mBluetoothLeService.disconnect();
                return true;
            case android.R.id.home:
                onBackPressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void updateConnectionState(final int resourceId) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mConnectionState.setText(resourceId);
            }
        });
    }
String da="";
int len_g = 0;
    private void displayData( String data1 ) {
        //String head1,data_0;
        /*
        head1=data1.substring(0,2);
        data_0=data1.substring(2);
        */
        //da = da+data1+"\n";
        if( data1!=null&&data1.length()>0)
        {
            //mDataField.setText( data1 );
            //len_g += data1.length()/2;
            //da = data1+da;

            //rx_data_id_1.setText( data1 );
//          mDataField.setText( ""+len_g );
            mDataTemptured.setText(data1.substring(4, 6)+"℃");
            mSetTemptured.setText(data1.substring(6, 8)+"℃");
            mSetLTemptured.setText(data1.substring(8, 10)+"℃");
            mFenSuRang.setText(data1.substring(10, 12)+"档");

            //rx_data_id_1.setGravity(Gravity.BOTTOM);
            //rx_data_id_1.setSelection(rx_data_id_1.getText().length());



        }

    }

    // Demonstrates how to iterate through the supported GATT Services/Characteristics.
    // In this sample, we populate the data structure that is bound to the ExpandableListView
    // on the UI.
    private void displayGattServices(List<BluetoothGattService> gattServices) {
        if (gattServices == null) return;


        if( gattServices.size()>0&&mBluetoothLeService.get_connected_status( gattServices )>=4 )
        {
            if( connect_status_bit )
              {
                mConnected = true;
                show_view( true );
                mBluetoothLeService.enable_JDY_ble(true);
                 try {  
                        Thread.currentThread();  
                        Thread.sleep(100);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                 mBluetoothLeService.enable_JDY_ble(true);
                 updateConnectionState(R.string.connected);
              }else{
                  //Toast.makeText(this, "Deleted Successfully!", Toast.LENGTH_LONG).show(); 
                  Toast toast = Toast.makeText(DeviceControlActivity.this, "设备没有连接!", Toast.LENGTH_SHORT); 
                  toast.show(); 
              }
        }


//        SimpleExpandableListAdapter gattServiceAdapter = new SimpleExpandableListAdapter(
//                this,
//                gattServiceData,
//                android.R.layout.simple_expandable_list_item_2,
//                new String[] {LIST_NAME, LIST_UUID},
//                new int[] { android.R.id.text1, android.R.id.text2 },
//                gattCharacteristicData,
//                android.R.layout.simple_expandable_list_item_2,
//                new String[] {LIST_NAME, LIST_UUID},
//                new int[] { android.R.id.text1, android.R.id.text2 }
//        );
//        
//        mGattServicesList.setAdapter(gattServiceAdapter);

    }

    private static IntentFilter makeGattUpdateIntentFilter() {
        final IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);
        intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);
        intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);
        intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);
        return intentFilter;
    }
}


1个回答

    txd_txt=(EditText)findViewById(R.id.tx_text);//1002 data
    txd_txt.setText("28");

    txd_txtLowTempture=(EditText)findViewById(R.id.tx_dispLTemptuer);//1002 data
    txd_txtLowTempture.setText("15");


            刚在一位前辈的帮忙下,解决了。这里应该要初始化控件。加上:
              txd_txtfeedtime=(EditText)findViewById(R.id.tx_feedtimer);//1002 data
    txd_txtfeedtime.setText("15");
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
蓝牙4.0透传模式能否实现从单片机经蓝牙模块向手机发送数据?

如题,蓝牙模块BT05,支持BLE透传。 现在想实现数据从单片机经过蓝牙模块向手机APP的信息传输。发个信号高低电平也可以。 写代码的话是应该往APP里写还是蓝牙模块里写还是在单片机里写? 因为蓝牙支持透传模式,所以想通过透传实现蓝牙和手机的连接以及数据收发,看了很多资料应该是可以的,但是也不确实以及应该如何做下去。拜托懂的各位了。谢谢。 会不会和其中的主从模块设置有关?

BLE4.0蓝牙透传问题 CC2540模块

本人新手请多多指教,做安卓手机与CC2540的蓝牙透传以为是新手不知道整个代码的运行过程。还有就是主机发送给从机的数据,程序里这个数据是存在那个函数里,从机怎么接收数据的过程是怎样的,接收数据用到的函数是什么?代码我已经读了近半个月了,因为初次接触这个系统,很多地方不理解,而且网上的资料对于新手的我还是太难理解,请大神指点。。。。。

关于蓝牙透传波特率切换导致数据传输异常问题

在蓝牙模块透传过程中 波特率115200的时候可以正常传输数据、、、、但是切换到9600或者其他波特率的时候就会出现丢包现象。 我想的一个办法是在串口中断接收到数据后做一下微小的延时、但是仍然不能解决该问题,有没做蓝牙开发的朋友遇到过类似问题、求分享

手机如何通过蓝牙透传模块HC-05控制51单片机STC89C52上一个led灯的亮灭?

需要先往单片机里下载什么源程序(串口程序)吗?。。。如果有知道的,请不吝赐教,万分感谢![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/30.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/30.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/3.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/3.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/3.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/3.gif)

安卓蓝牙BLE只能发送数据,不能接收数据,求教求教!

用的QN9021蓝牙模块,串口助手监控; ![图片说明](https://img-ask.csdn.net/upload/201602/16/1455633053_721235.png) 找到能够发送数据的characteristic,发送数据,串口助手收到数据 ![图片说明](https://img-ask.csdn.net/upload/201602/16/1455633137_465921.png) ![图片说明](https://img-ask.csdn.net/upload/201602/16/1455633201_988068.png) 串口助手发送数据,接收数据总是null或者0,接收不到数据 ![图片说明](https://img-ask.csdn.net/upload/201602/16/1455633298_320514.png) 所有的characteristic都试过了,还是不能读到数据,十分困惑,求教!!!

android蓝牙4.0拿到了uuid在哪个方法怎么发送数据? 请贴具体代码

android蓝牙4.0拿到了uuid在哪个方法怎么发送数据? 请贴具体代码 ,谢谢

使用GSM模块,TCP透传模式,对One net平台进行数据传输,最快可达到服务器多少秒更新一次。

STC15F系列+SIM900A模块 采用 TCP透传对OneNet平台进行数据传输, 最短可实现平台多少秒更新一次数据

nginx udp 透传无法获取客户端真实IP

nginx版本是 1.12.2 客户端IP nginx vip 192.168.1.10 nginx1 ip 192.168.1.11 nginx2 ip 192.168.1.12 service1 ip 192.168.1.13 service2 ip 192.168.1.14 现在是所有的客户端配置的UDP都指向192.168.1.10:162,然后通过nginx vip透传到Nginx1和nginx2,但在 service 上面通过respEvnt.getPeerAddress() 得到的客户端IP为nginx1的,而不是客户端真实IP,请问这个有什么办法吗? nginx 配置文件 upstream testAgent{ server 192.168.1.14:162; server 192.168.1.13:162; } ############for AppServer ############## server { listen 162 udp; proxy_connect_timeout 5s; proxy_timeout 3s; proxy_pass testAgent; proxy_bind $remote_addr transparent; }

新手求助:cc2541芯片的BT-05 BLE4.0蓝牙透传模块使用问题

最近在用这个模块做手机到stm32的蓝牙控制和数据采集。模块之间的主从机通信在电脑的串口助手试过没问题,但是从电脑端的主机串口助手发送指令到stm32上的从机的时候,stm32一直收不到指令,但是用手机上的蓝牙串口助手发送指令,32就能得到指令,但是从32上面反馈到主机的指令,手机一直收不到反馈。 (ps:模块和stm32之间是串口通信方式连接,是不是这里有问题)

百度云推送 java后台可以向android推送透传消息吗

百度云推送 java后台可以向android推送透传消息吗?

android 蓝牙4.0读数据问题

android 蓝牙4.0 一次可以读20个字节,为什么我读一次只有10个字节,如何设置,求大神告知。谢谢

freeswitch在Bypass媒体下为什么修改了200中的SDP,没有透传?

基于freeswitch和Boghe IMS/RCS client搭建了一个Voip环境,想让媒体基于P2P方式,所以将freeswitch设置成了无媒体方式(internal.xml中的inbound-bypass-media设置为true,default.xml中增加bypass_meidia=true), 实际测试过程中发现被叫应答的时候200中的SDP freeswitch没有透传到主叫侧(被叫没发183),freeswitch将SDP中的Media description给改了,导致主被叫媒体不通。请各位大神帮忙看下具体是什么问题,多谢。 被叫发过来的200中的SDP: v=0 o=doubango 1983 678901 IN IP4 10.61.42.135 s=- c=IN IP4 10.61.42.135 t=0 0 m=audio 6738 RTP/AVPF 8 101 a=ptime:20 a=silenceSupp:off - - - - a=rtpmap:8 PCMA/8000/1 a=rtpmap:101 telephone-event/8000/1 a=fmtp:101 0-16 a=acfg:1 t=1 a=sendrecv a=rtcp-mux a=ssrc:4189294891 cname:ldjWoB60jbyQlR6e a=ssrc:4189294891 mslabel:6994f7d1-6ce9-4fbd-acfd-84e5131ca2e2 a=ssrc:4189294891 label:Doubango.Audio freeswitch发送给主叫侧的200消息中的SDP: v=0 o=doubango 1983 678901 IN IP4 10.61.42.135 s=- c=IN IP4 10.61.42.135 t=0 0 m=audio 0 RTP/AVP 19

手机蓝牙与单片机的通信如何实现?

手机是安卓系统的,蓝牙模块采用hc-06,单片机用msp430f149.具体要求是手机发数据能通过蓝牙模块传给单片机然后做出相应的反应(如控制LED的亮灭等)。

两块stc12c5a60s2单片机通过两块蓝牙模块HC05进行数据接受,是怎么编程实现的呢?

用两块蓝牙模块进行数据透传,主单片机将数据传给主蓝牙模块,从蓝牙模块接受到主模块 数据后传给从机并显示数据。

nrf51802接收串口数据,导致系统重启

用nrf51802作为数据透传模块,当上位MCU发送串口数据,导致nrf51802系统重启 void UART0_IRQHandler(void) { // Handle reception if (NRF_UART0->EVENTS_RXDRDY != 0) { uint32_t err_code; // Clear UART RX event flag NRF_UART0->EVENTS_RXDRDY = 0; // Write received byte to FIFO err_code = app_fifo_put(&m_rx_fifo, (uint8_t)NRF_UART0->RXD); if (err_code != NRF_SUCCESS) { app_uart_evt_t app_uart_event; app_uart_event.evt_type = APP_UART_FIFO_ERROR; app_uart_event.data.error_code = err_code; m_event_handler(&app_uart_event); } // Notify that new data is available if this was first byte put in the buffer. else if (FIFO_LENGTH(m_rx_fifo) == 1) { app_uart_evt_t app_uart_event; app_uart_event.evt_type = APP_UART_DATA_READY; m_event_handler(&app_uart_event); } else { // Do nothing, only send event if first byte was added or overflow in FIFO occurred. } } // Handle transmission. if (NRF_UART0->EVENTS_TXDRDY != 0) { // Clear UART TX event flag. NRF_UART0->EVENTS_TXDRDY = 0; on_uart_event(ON_TX_READY); } // Handle errors. if (NRF_UART0->EVENTS_ERROR != 0) { uint32_t error_source; app_uart_evt_t app_uart_event; // Clear UART ERROR event flag. NRF_UART0->EVENTS_ERROR = 0; // Clear error source. error_source = NRF_UART0->ERRORSRC; NRF_UART0->ERRORSRC = error_source; app_uart_event.evt_type = APP_UART_COMMUNICATION_ERROR; app_uart_event.data.error_communication = error_source; m_event_handler(&app_uart_event); } }

zigbee 用serialApp串口透传例子作为模板加温湿度测量,能帮忙解决问题的可有偿,先谢谢大家!

温湿度显示不出来,完整的工程代码如下, # 部分关键代码如下,完整工程文件在下面的链接 自定义的函数! static void SampleApp_Send_P2P_Message(void) { char temp[3], humidity[3], strTemp[7]; DHT11(); //获取温湿度 //将数据整合后方便发给协调器显示 osal_memcpy(strTemp, temp, 2); osal_memcpy(&strTemp[2], " ", 1); osal_memcpy(&strTemp[3], humidity, 3); //获得的温湿度通过串口输出到电脑显示 HalUARTWrite(0, "T&H:", 4); HalUARTWrite(0, (uint8 *)strTemp, 5); HalUARTWrite(0, "\n",1); afAddrType_t SerialApp_TxAddr; SerialApp_TxAddr.addrMode = (afAddrMode_t)Addr16Bit; SerialApp_TxAddr.endPoint = SERIALAPP_ENDPOINT; SerialApp_TxAddr.addr.shortAddr = 0x0000; if (afStatus_SUCCESS != AF_DataRequest(&SerialApp_TxAddr, (endPointDesc_t *)&SerialApp_epDesc, SAMPLEAPP_P2P_CLUSTERID, 5, (uint8 *)strTemp, &SerialApp_MsgID, 0, AF_DEFAULT_RADIUS)) { osal_set_event(SerialApp_TaskID, SampleApp_Send_P2P_EVT); } } ```在接收函数中自己添加了一个簇ID处理这个消息 void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt ) { case SAMPLEAPP_P2P_CLUSTERID: HalUARTWrite(SERIAL_APP_PORT, "T&H:", 4); //提示接收到数据 HalUARTWrite(SERIAL_APP_PORT, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据 HalUARTWrite(SERIAL_APP_PORT, "\n", 1); // 回车换行 } ## 在事件处理函数中 自己添加了一个事件 在事件处理函数中 自己添加了一个事件 if ( events & SampleApp_Send_P2P_EVT ) { SampleApp_Send_P2P_Message(); //osal_start_timerEx( SerialApp_TaskID, SampleApp_Send_P2P_EVT, 1000 ); return ( events ^ SampleApp_Send_P2P_EVT ); } 在这个例子模板中都是点播发送! 哪位前辈能帮忙指导一下,先谢过! ```

JDY-31-SPP蓝牙模块怎么进入命令设置状态

![图片说明](https://img-ask.csdn.net/upload/201811/22/1542897363_737936.png) 网上查的手册是 发送AT\r\n后显示OK 但是我输入后,蓝牙模块回复的是下面这样的![图片说明](https://img-ask.csdn.net/upload/201811/22/1542897420_599542.png 求大神救救我!

接受app传过来的二进制流但是传多张的话会变成一张

public AjaxJson upload2(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException { AjaxJson json = new AjaxJson(); //创建一个通用的多部分解析器 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //判断 request 是否有文件上传,即多部分请求 if(multipartResolver.isMultipart(request)){ //转换成多部分request MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request; //取得request中的所有文件名 Iterator<String> iter = multiRequest.getFileNames(); System.out.println("**************"); System.out.println(iter); while(iter.hasNext()){ //记录上传过程起始时的时间,用来计算上传时间 int pre = (int) System.currentTimeMillis(); //取得上传文件 MultipartFile file = multiRequest.getFile(iter.next()); if(file != null){ //取得当前上传文件的文件名称 String myFileName = file.getOriginalFilename(); //如果名称不为“”,说明该文件存在,否则说明该文件不存在 if(myFileName.trim() !=""){ System.out.println("111111111111111"); System.out.println(myFileName); //重命名上传后的文件名 String fileName = "demoUpload" + file.getOriginalFilename(); String path = "F:/" + fileName; File localFile = new File(path); file.transferTo(localFile); } } //记录上传该文件后的时间 int finaltime = (int) System.currentTimeMillis(); System.out.println(finaltime - pre); } } return json; } 这个是什么原因呢 求解决办法

服务端是java,使用个推给IOS推送消息,IOS通知栏能收到那种,求参考代码

服务端是java,使用个推给IOS推送消息,IOS通知栏能收到那种,求参考代码 我是参考个推官网的例子,IOS接收不到 ``` public class Test { //定义常量, appId、appKey、masterSecret 采用本文档 "第二步 获取访问凭证 "中获得的应用配置 private static String appId = ""; private static String appKey = ""; private static String masterSecret = ""; private static String url = "http://sdk.open.api.igexin.com/apiex.htm"; public static void main(String[] args) throws IOException { IGtPush push = new IGtPush(url, appKey, masterSecret); // 定义"点击链接打开通知模板",并设置标题、内容、链接 LinkTemplate template = new LinkTemplate(); template.setAppId(appId); template.setAppkey(appKey); template.setTitle("欢迎使用个推!!!!!!!!!!!!!"); template.setText("这是一条推送消息~!!!!!!!!!!"); template.setUrl("http://getui.com"); List<String> appIds = new ArrayList<String>(); appIds.add(appId); // 定义"AppMessage"类型消息对象,设置消息内容模板、发送的目标App列表、是否支持离线发送、以及离线消息有效期(单位毫秒) AppMessage message = new AppMessage(); TransmissionTemplate transmissionTemplate = getTemplate(); message.setData(transmissionTemplate); message.setAppIdList(appIds); message.setOffline(true); message.setOfflineExpireTime(1000 * 600); // notificationTemplateDemo(appId, appKey); IPushResult ret = push.pushMessageToApp(message); System.out.println(ret.getResponse().toString()); } public static TransmissionTemplate getTemplate() { TransmissionTemplate template = new TransmissionTemplate(); template.setAppId(appId); template.setAppkey(appKey); template.setTransmissionContent("透传内容"); template.setTransmissionType(2); APNPayload payload = new APNPayload(); payload.setBadge(1); payload.setContentAvailable(1); payload.setSound("default"); payload.setCategory("$由客户端定义"); //简单模式APNPayload.SimpleMsg payload.setAlertMsg(new APNPayload.SimpleAlertMsg("hello")); //字典模式使用下者 // payload.setAlertMsg(getDictionaryAlertMsg()); // template.setAPNInfo(payload); return template; } private static APNPayload.DictionaryAlertMsg getDictionaryAlertMsg(){ APNPayload.DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg(); alertMsg.setBody("body"); alertMsg.setActionLocKey("ActionLockey"); alertMsg.setLocKey("LocKey"); alertMsg.addLocArg("loc-args"); alertMsg.setLaunchImage("launch-image"); // IOS8.2以上版本支持 alertMsg.setTitle("Title"); alertMsg.setTitleLocKey("TitleLocKey"); alertMsg.addTitleLocArg("TitleLocArg"); return alertMsg; } } ```

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

C++11:一些微小的变化(新的数据类型、template表达式内的空格、nullptr、std::nullptr_t)

本文介绍一些C++的两个新特性,它们虽然微小,但对你的编程十分重要 一、Template表达式内的空格 C++11标准之前建议在“在两个template表达式的闭符之间放一个空格”的要求已经过时了 例如: vector&lt;list&lt;int&gt; &gt;; //C++11之前 vector&lt;list&lt;int&gt;&gt;; //C++11 二、nullptr ...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

【阿里P6面经】二本,curd两年,疯狂复习,拿下阿里offer

二本的读者,在老东家不断学习,最后逆袭

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...

作者 | 伍杏玲出品 | CSDN(ID:CSDNnews)格子衬衫、常掉发、双肩包、修电脑、加班多……这些似乎成了大众给程序员的固定标签。近几年流行的“跨界风”开始刷新人们对程序员的...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐