日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机与手机应用进行蓝牙通讯

發布時間:2024/1/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机与手机应用进行蓝牙通讯 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單片機連接手機應用客戶端進行藍牙通訊:

學習了!!!!分享:

package com.severn;import java.util.ArrayList;import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast;import com.severn.ui.Ble_Activity;/*** @Description: TODO<MainActivity類實現打開藍牙、掃描藍牙>*/ public class MainActivity extends Activity implements OnClickListener {// 掃描藍牙按鈕private Button scan_btn;// 藍牙適配器BluetoothAdapter mBluetoothAdapter;// 藍牙信號強度private ArrayList<Integer> rssis;// 自定義AdapterLeDeviceListAdapter mleDeviceListAdapter;// listview顯示掃描到的藍牙信息ListView lv;// 描述掃描藍牙的狀態private boolean mScanning;private boolean scan_flag;private Handler mHandler;int REQUEST_ENABLE_BT = 1;// 藍牙掃描時間private static final long SCAN_PERIOD = 10000;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化控件init();// 初始化藍牙init_ble();scan_flag = true;// 自定義適配器mleDeviceListAdapter = new LeDeviceListAdapter();// 為listview指定適配器lv.setAdapter(mleDeviceListAdapter);/* listview點擊函數 */lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> arg0, View v, int position,long id){// TODO Auto-generated method stubfinal BluetoothDevice device = mleDeviceListAdapter.getDevice(position);if (device == null)return;final Intent intent = new Intent(MainActivity.this,Ble_Activity.class);intent.putExtra(Ble_Activity.EXTRAS_DEVICE_NAME,device.getName());intent.putExtra(Ble_Activity.EXTRAS_DEVICE_ADDRESS,device.getAddress());if (mScanning){/* 停止掃描設備 */mBluetoothAdapter.stopLeScan(mLeScanCallback);mScanning = false;}try{// 啟動Ble_ActivitystartActivity(intent);} catch (Exception e){e.printStackTrace();// TODO: handle exception}}});}/*** @Title: init* @Description: TODO(初始化UI控件)* @return void* @throws*/private void init(){scan_btn = this.findViewById(R.id.scan_dev_btn);scan_btn.setOnClickListener(this);lv = this.findViewById(R.id.lv);mHandler = new Handler();}/*** @Title: init_ble* @Description: TODO(初始化藍牙)* @return void* @throws*/private void init_ble(){// 手機硬件支持藍牙if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){Toast.makeText(this, "不支持BLE", Toast.LENGTH_SHORT).show();finish();}// Initializes Bluetooth adapter.// 獲取手機本地的藍牙適配器final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);mBluetoothAdapter = bluetoothManager.getAdapter();// 打開藍牙權限if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()){Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);}}/** 按鈕響應事件*/@Overridepublic void onClick(View v){// TODO Auto-generated method stubif (scan_flag){mleDeviceListAdapter = new LeDeviceListAdapter();lv.setAdapter(mleDeviceListAdapter);scanLeDevice(true);} else{scanLeDevice(false);scan_btn.setText("掃描設備");}}/*** @Title: scanLeDevice* @Description: TODO(掃描藍牙設備 )* @param enable* (掃描使能,true:掃描開始,false:掃描停止)* @return void* @throws*/private void scanLeDevice(final boolean enable){if (enable){// Stops scanning after a pre-defined scan period.mHandler.postDelayed(new Runnable(){@Overridepublic void run(){mScanning = false;scan_flag = true;scan_btn.setText("掃描設備");Log.i("SCAN", "stop.....................");mBluetoothAdapter.stopLeScan(mLeScanCallback);}}, SCAN_PERIOD);/* 開始掃描藍牙設備,帶mLeScanCallback 回調函數 */Log.i("SCAN", "begin.....................");mScanning = true;scan_flag = false;scan_btn.setText("停止掃描");mBluetoothAdapter.startLeScan(mLeScanCallback);} else{Log.i("Stop", "stoping................");mScanning = false;mBluetoothAdapter.stopLeScan(mLeScanCallback);scan_flag = true;}}/*** 藍牙掃描回調函數 實現掃描藍牙設備,回調藍牙BluetoothDevice,可以獲取name MAC等信息* * **/private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback(){@Overridepublic void onLeScan(final BluetoothDevice device, final int rssi,byte[] scanRecord){// TODO Auto-generated method stubrunOnUiThread(new Runnable(){@Overridepublic void run(){/* 講掃描到設備的信息輸出到listview的適配器 */mleDeviceListAdapter.addDevice(device);mleDeviceListAdapter.notifyDataSetChanged();}});}};/*** @Description: TODO<自定義適配器Adapter,作為listview的適配器>* @version: V1.0*/private class LeDeviceListAdapter extends BaseAdapter {private ArrayList<BluetoothDevice> mLeDevices;private LayoutInflater mInflator;public LeDeviceListAdapter(){super();//rssis = new ArrayList();mLeDevices = new ArrayList();mInflator = getLayoutInflater();}public void addDevice(BluetoothDevice device){if (!mLeDevices.contains(device)){mLeDevices.add(device);}}public BluetoothDevice getDevice(int position){return mLeDevices.get(position);}public void clear(){mLeDevices.clear();rssis.clear();}@Overridepublic int getCount(){return mLeDevices.size();}@Overridepublic Object getItem(int i){return mLeDevices.get(i);}@Overridepublic long getItemId(int i){return i;}/*** 重寫getview* * **/@Overridepublic View getView(int i, View view, ViewGroup viewGroup){// General ListView optimization code.// 加載listview每一項的視圖view = mInflator.inflate(R.layout.listitem, null);// 初始化三個textview顯示藍牙信息//TextView deviceAddress = view// .findViewById(R.id.tv_deviceAddr);TextView deviceName = view.findViewById(R.id.tv_deviceName);//TextView rssi =view.findViewById(R.id.tv_rssi);BluetoothDevice device = mLeDevices.get(i);//deviceAddress.setText(device.getAddress());deviceName.setText(device.getName());//rssi.setText("" + rssis.get(i));return view;}}}

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="${relativePackage}.${activityClass}" ><Button android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="20dip"android:layout_marginRight="20dip"android:layout_marginTop="30dip"android:text="掃描設備"android:id="@+id/scan_dev_btn"/><ListViewandroid:id="@+id/lv"android:layout_marginTop="100dip"android:layout_marginLeft="20dip"android:layout_marginRight="20dip"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginBottom="50dip" > </ListView></RelativeLayout>

listyview.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" android:background="@drawable/bg_button"><LinearLayoutandroid:layout_width="match_parent"android:background="#00BA79"android:layout_height="wrap_content" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ffffff"android:textSize="25dp"android:text="設備名稱:" /><TextViewandroid:id="@+id/tv_deviceName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ffffff"android:textSize="25dp"android:text="TextView" /></LinearLayout></LinearLayout>

Ble_activity

package com.severn.ui;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.severn.service.*; import android.app.Activity; import android.bluetooth.BluetoothGattCharacteristic; import android.bluetooth.BluetoothGattDescriptor; 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.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ScrollView; import android.widget.TextView;import com.severn.R; import com.severn.service.BluetoothLeService;/** * @Description: TODO<Ble_Activity實現連接BLE,發送和接受BLE的數據> */ public class Ble_Activity extends Activity implements OnClickListener {private final static String TAG = Ble_Activity.class.getSimpleName();//藍牙4.0的UUID,其中0000ffe1-0000-1000-8000-00805f9b34fb是廣州匯承信息科技有限公司08藍牙模塊的UUIDpublic static String HEART_RATE_MEASUREMENT = "0000ffe1-0000-1000-8000-00805f9b34fb";public static String EXTRAS_DEVICE_NAME = "DEVICE_NAME";;public static String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";public static String EXTRAS_DEVICE_RSSI = "RSSI";//藍牙連接狀態private boolean mConnected = false;private String status = "disconnected";//藍牙名字private String mDeviceName;//藍牙地址private String mDeviceAddress;//藍牙信號值private String mRssi;private Bundle b;private String rev_str = "";//藍牙service,負責后臺的藍牙服務private static BluetoothLeService mBluetoothLeService;//文本框,顯示接受的內容private TextView rev_tv, connect_state;//發送按鈕private Button send_btn;//文本編輯框private EditText send_et;private ScrollView rev_sv;private ArrayList<ArrayList<BluetoothGattCharacteristic>> mGattCharacteristics = new ArrayList<ArrayList<BluetoothGattCharacteristic>>();//藍牙特征值private static BluetoothGattCharacteristic target_chara = null;private Handler mhandler = new Handler();private Handler myHandler = new Handler(){// 2.重寫消息處理函數public void handleMessage(Message msg){switch (msg.what){// 判斷發送的消息case 1:{// 更新ViewString state = msg.getData().getString("connect_state");connect_state.setText(state);break;}}super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState){// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.ble_activity);b = getIntent().getExtras();//從意圖獲取顯示的藍牙信息mDeviceName = b.getString(EXTRAS_DEVICE_NAME);mDeviceAddress = b.getString(EXTRAS_DEVICE_ADDRESS);//mRssi = b.getString(EXTRAS_DEVICE_RSSI);/* 啟動藍牙service */Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);init();}@Overrideprotected void onDestroy(){super.onDestroy();//解除廣播接收器unregisterReceiver(mGattUpdateReceiver);mBluetoothLeService = null;}// Activity出來時候,綁定廣播接收器,監聽藍牙連接服務傳過來的事件@Overrideprotected void onResume(){super.onResume();//綁定廣播接收器registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());if (mBluetoothLeService != null){ //根據藍牙地址,建立連接final boolean result = mBluetoothLeService.connect(mDeviceAddress);Log.d(TAG, "Connect request result=" + result);}}/** * @Title: init * @Description: TODO(初始化UI控件) * @param 無* @return void * @throws */ private void init(){rev_sv = (ScrollView) this.findViewById(R.id.rev_sv);rev_tv = (TextView) this.findViewById(R.id.rev_tv);connect_state = (TextView) this.findViewById(R.id.connect_state);send_btn = (Button) this.findViewById(R.id.send_btn);send_et = (EditText) this.findViewById(R.id.send_et);connect_state.setText(status);send_btn.setOnClickListener(this);}/* BluetoothLeService綁定的回調函數 */private final ServiceConnection mServiceConnection = new ServiceConnection(){@Overridepublic void onServiceConnected(ComponentName componentName,IBinder service){mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();if (!mBluetoothLeService.initialize()){Log.e(TAG, "Unable to initialize Bluetooth");finish();}// 根據藍牙地址,連接設備mBluetoothLeService.connect(mDeviceAddress);}@Overridepublic void onServiceDisconnected(ComponentName componentName){mBluetoothLeService = null;}};/*** 廣播接收器,負責接收BluetoothLeService類發送的數據*/private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent){final String action = intent.getAction();if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action))//Gatt連接成功{mConnected = true;status = "connected";//更新連接狀態updateConnectionState(status);System.out.println("BroadcastReceiver :" + "device connected");} else if (BluetoothLeService.ACTION_GATT_DISCONNECTED//Gatt連接失敗.equals(action)){mConnected = false;status = "disconnected";//更新連接狀態updateConnectionState(status);System.out.println("BroadcastReceiver :"+ "device disconnected");} else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED//發現GATT服務器.equals(action)){// Show all the supported services and characteristics on the// user interface.//獲取設備的所有藍牙服務displayGattServices(mBluetoothLeService.getSupportedGattServices());System.out.println("BroadcastReceiver :"+ "device SERVICES_DISCOVERED");} else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action))//有效數據{ //處理發送過來的數據displayData(intent.getExtras().getString(BluetoothLeService.EXTRA_DATA));System.out.println("BroadcastReceiver onData:"+ intent.getStringExtra(BluetoothLeService.EXTRA_DATA));}}};/* 更新連接狀態 */private void updateConnectionState(String status){Message msg = new Message();msg.what = 1;Bundle b = new Bundle();b.putString("connect_state", status);msg.setData(b);//將連接狀態更新的UI的textview上myHandler.sendMessage(msg);System.out.println("connect_state:" + status);}/* 意圖過濾器 */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;}/** * @Title: displayData * @Description: TODO(接收到的數據在scrollview上顯示) * @param @param rev_string(接受的數據)* @return void * @throws */ private void displayData(String rev_string){rev_str += rev_string;runOnUiThread(new Runnable(){@Overridepublic void run(){rev_tv.setText(rev_str);rev_sv.scrollTo(0, rev_tv.getMeasuredHeight());System.out.println("rev:" + rev_str);}});}/** * @Title: displayGattServices * @Description: TODO(處理藍牙服務) * @param 無 * @return void * @throws */ private void displayGattServices(List<BluetoothGattService> gattServices){if (gattServices == null)return;String uuid = null;// 服務數據,可擴展下拉列表的第一級數據ArrayList<HashMap<String, String>> gattServiceData = new ArrayList<HashMap<String, String>>();// 特征數據(隸屬于某一級服務下面的特征值集合)ArrayList<ArrayList<HashMap<String, String>>> gattCharacteristicData = new ArrayList<ArrayList<HashMap<String, String>>>();// 部分層次,所有特征值集合mGattCharacteristics = new ArrayList<ArrayList<BluetoothGattCharacteristic>>();// Loops through available GATT Services.for (BluetoothGattService gattService : gattServices){// 獲取服務列表HashMap<String, String> currentServiceData = new HashMap<String, String>();uuid = gattService.getUuid().toString();// 查表,根據該uuid獲取對應的服務名稱。SampleGattAttributes這個表需要自定義。gattServiceData.add(currentServiceData);System.out.println("Service uuid:" + uuid);ArrayList<HashMap<String, String>> gattCharacteristicGroupData = new ArrayList<HashMap<String, String>>();// 從當前循環所指向的服務中讀取特征值列表List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();ArrayList<BluetoothGattCharacteristic> charas = new ArrayList<BluetoothGattCharacteristic>();// Loops through available Characteristics.// 對于當前循環所指向的服務中的每一個特征值for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics){charas.add(gattCharacteristic);HashMap<String, String> currentCharaData = new HashMap<String, String>();uuid = gattCharacteristic.getUuid().toString();if (gattCharacteristic.getUuid().toString().equals(HEART_RATE_MEASUREMENT)){// 測試讀取當前Characteristic數據,會觸發mOnDataAvailable.onCharacteristicRead()mhandler.postDelayed(new Runnable(){@Overridepublic void run(){// TODO Auto-generated method stubmBluetoothLeService.readCharacteristic(gattCharacteristic);}}, 200);// 接受Characteristic被寫的通知,收到藍牙模塊的數據后會觸發mOnDataAvailable.onCharacteristicWrite()mBluetoothLeService.setCharacteristicNotification(gattCharacteristic, true);target_chara = gattCharacteristic;// 設置數據內容// 往藍牙模塊寫入數據// mBluetoothLeService.writeCharacteristic(gattCharacteristic);}List<BluetoothGattDescriptor> descriptors = gattCharacteristic.getDescriptors();for (BluetoothGattDescriptor descriptor : descriptors){System.out.println("---descriptor UUID:"+ descriptor.getUuid());// 獲取特征值的描述mBluetoothLeService.getCharacteristicDescriptor(descriptor);// mBluetoothLeService.setCharacteristicNotification(gattCharacteristic,// true);}gattCharacteristicGroupData.add(currentCharaData);}// 按先后順序,分層次放入特征值集合中,只有特征值mGattCharacteristics.add(charas);// 構件第二級擴展列表(服務下面的特征值)gattCharacteristicData.add(gattCharacteristicGroupData);}}/*** 將數據分包* * **/public int[] dataSeparate(int len){ int[] lens = new int[2];lens[0]=len/20;lens[1]=len-20*lens[0];return lens;}/* * 發送按鍵的響應事件,主要發送文本框的數據*/@Overridepublic void onClick(View v){// TODO Auto-generated method stubbyte[] buff = send_et.getText().toString().getBytes();int len = buff.length;int[] lens = dataSeparate(len);for(int i =0;i<lens[0];i++){String str = new String(buff, 20*i, 20);target_chara.setValue(str);//只能一次發送20字節,所以這里要分包發送//調用藍牙服務的寫特征值方法實現發送數據mBluetoothLeService.writeCharacteristic(target_chara);}if(lens[1]!=0){String str = new String(buff, 20*lens[0], lens[1]);target_chara.setValue(str);//調用藍牙服務的寫特征值方法實現發送數據mBluetoothLeService.writeCharacteristic(target_chara);}}}

ble_activity.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="狀態:"android:layout_marginLeft="10dip"/><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/connect_state"/></LinearLayout><ScrollViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:id="@+id/rev_sv"><TextView android:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/rev_tv"/></ScrollView><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:orientation="horizontal" ><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:id="@+id/send_et"android:typeface="normal" ></EditText><Buttonandroid:id="@+id/send_btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="3"android:text="send" /></LinearLayout></LinearLayout>

BluetoothLeService.class

package com.severn.service;import java.util.ArrayList; import java.util.List; import java.util.UUID;import android.app.Service; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCallback; import android.bluetooth.BluetoothGattCharacteristic; import android.bluetooth.BluetoothGattDescriptor; import android.bluetooth.BluetoothGattService; import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.Intent; import android.hardware.Sensor; import android.os.Binder; import android.os.IBinder; import android.util.Log;/** * @Description: TODO<藍牙服務,負責在后臺實現藍牙的連接,數據的發送接受> */ public class BluetoothLeService extends Service {private final static String TAG = "BluetoothLeService";// luetoothLeService.class.getSimpleName();private List<Sensor> mEnabledSensors = new ArrayList<Sensor>();//藍牙相關類private BluetoothManager mBluetoothManager;private BluetoothAdapter mBluetoothAdapter;private String mBluetoothDeviceAddress;private BluetoothGatt mBluetoothGatt;private int mConnectionState = STATE_DISCONNECTED;private static final int STATE_DISCONNECTED = 0;private static final int STATE_CONNECTING = 1;private static final int STATE_CONNECTED = 2;public final static String ACTION_GATT_CONNECTED = "com.hc_ble.bluetooth.le.ACTION_GATT_CONNECTED";public final static String ACTION_GATT_DISCONNECTED = "com.hc_ble.bluetooth.le.ACTION_GATT_DISCONNECTED";public final static String ACTION_GATT_SERVICES_DISCOVERED = "com.hc_ble.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";public final static String ACTION_DATA_AVAILABLE = "com.hc_ble.bluetooth.le.ACTION_DATA_AVAILABLE";public final static String EXTRA_DATA = "com.hc_ble.bluetooth.le.EXTRA_DATA";// public final static UUID UUID_HEART_RATE_MEASUREMENT =zzzzzzzzzzzzz// UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT);private OnDataAvailableListener mOnDataAvailableListener;// Implements callback methods for GATT events that the app cares about. For// example,// connection change and services discovered.public interface OnDataAvailableListener {public void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status);public void onCharacteristicWrite(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic);public void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic);}public void setOnDataAvailableListener(OnDataAvailableListener l){mOnDataAvailableListener = l;}/* 連接遠程設備的回調函數 */private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback(){@Overridepublic void onConnectionStateChange(BluetoothGatt gatt, int status,int newState){String intentAction;if (newState == BluetoothProfile.STATE_CONNECTED)//連接成功{intentAction = ACTION_GATT_CONNECTED;mConnectionState = STATE_CONNECTED;/* 通過廣播更新連接狀態 */broadcastUpdate(intentAction);Log.i(TAG, "Connected to GATT server.");// Attempts to discover services after successful connection.Log.i(TAG, "Attempting to start service discovery:"+ mBluetoothGatt.discoverServices());} else if (newState == BluetoothProfile.STATE_DISCONNECTED)//連接失敗{intentAction = ACTION_GATT_DISCONNECTED;mConnectionState = STATE_DISCONNECTED;Log.i(TAG, "Disconnected from GATT server.");broadcastUpdate(intentAction);}}/** 重寫onServicesDiscovered,發現藍牙服務* * */@Overridepublic void onServicesDiscovered(BluetoothGatt gatt, int status){if (status == BluetoothGatt.GATT_SUCCESS)//發現到服務{broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);Log.i(TAG, "--onServicesDiscovered called--");} else{Log.w(TAG, "onServicesDiscovered received: " + status);System.out.println("onServicesDiscovered received: " + status);}}/** 特征值的讀寫* */@Overridepublic void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status){if (status == BluetoothGatt.GATT_SUCCESS){Log.i(TAG, "--onCharacteristicRead called--");//從特征值讀取數據byte[] sucString = characteristic.getValue();String string = new String(sucString);//將數據通過廣播到Ble_ActivitybroadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);}}/** 特征值的改變* */@Overridepublic void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic){broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);}/** 特征值的寫* */@Overridepublic void onCharacteristicWrite(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, int status){// 以下語句實現 發送完數據或也顯示到界面上//broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);}/** 讀描述值* */@Overridepublic void onDescriptorRead(BluetoothGatt gatt,BluetoothGattDescriptor descriptor, int status){// TODO Auto-generated method stub// super.onDescriptorRead(gatt, descriptor, status);Log.w(TAG, "----onDescriptorRead status: " + status);byte[] desc = descriptor.getValue();if (desc != null){Log.w(TAG, "----onDescriptorRead value: " + new String(desc));}}/** 寫描述值* */@Overridepublic void onDescriptorWrite(BluetoothGatt gatt,BluetoothGattDescriptor descriptor, int status){// TODO Auto-generated method stub// super.onDescriptorWrite(gatt, descriptor, status);Log.w(TAG, "--onDescriptorWrite--: " + status);}/** 讀寫藍牙信號值* */@Overridepublic void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status){// TODO Auto-generated method stub// super.onReadRemoteRssi(gatt, rssi, status);Log.w(TAG, "--onReadRemoteRssi--: " + status);broadcastUpdate(ACTION_DATA_AVAILABLE, rssi);}@Overridepublic void onReliableWriteCompleted(BluetoothGatt gatt, int status){// TODO Auto-generated method stub// super.onReliableWriteCompleted(gatt, status);Log.w(TAG, "--onReliableWriteCompleted--: " + status);}};//廣播意圖private void broadcastUpdate(final String action, int rssi){final Intent intent = new Intent(action);intent.putExtra(EXTRA_DATA, String.valueOf(rssi));sendBroadcast(intent);}//廣播意圖private void broadcastUpdate(final String action){final Intent intent = new Intent(action);sendBroadcast(intent);}/* 廣播遠程發送過來的數據 */public void broadcastUpdate(final String action,final BluetoothGattCharacteristic characteristic){final Intent intent = new Intent(action);//從特征值獲取數據final byte[] data = characteristic.getValue();if (data != null && data.length > 0){final StringBuilder stringBuilder = new StringBuilder(data.length);for (byte byteChar : data){stringBuilder.append(String.format("%02X ", byteChar));Log.i(TAG, "***broadcastUpdate: byteChar = " + byteChar);}intent.putExtra(EXTRA_DATA, new String(data));System.out.println("broadcastUpdate for read data:"+ new String(data));}sendBroadcast(intent);}public class LocalBinder extends Binder {public BluetoothLeService getService(){return BluetoothLeService.this;}}@Overridepublic IBinder onBind(Intent intent){return mBinder;}@Overridepublic boolean onUnbind(Intent intent){close();return super.onUnbind(intent);}private final IBinder mBinder = new LocalBinder();/*** Initializes a reference to the local Bluetooth adapter.* * @return Return true if the initialization is successful.*//* service 中藍牙初始化 */public boolean initialize(){// For API level 18 and above, get a reference to BluetoothAdapter// through// BluetoothManager.if (mBluetoothManager == null){ //獲取系統的藍牙管理器mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);if (mBluetoothManager == null){Log.e(TAG, "Unable to initialize BluetoothManager.");return false;}}mBluetoothAdapter = mBluetoothManager.getAdapter();if (mBluetoothAdapter == null){Log.e(TAG, "Unable to obtain a BluetoothAdapter.");return false;}return true;}/*** Connects to the GATT server hosted on the Bluetooth LE device.* * @param address* The device address of the destination device.* * @return Return true if the connection is initiated successfully. The* connection result is reported asynchronously through the* {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}* callback.*/// 連接遠程藍牙public boolean connect(final String address){if (mBluetoothAdapter == null || address == null){Log.w(TAG,"BluetoothAdapter not initialized or unspecified address.");return false;}// Previously connected device. Try to reconnect.if (mBluetoothDeviceAddress != null&& address.equals(mBluetoothDeviceAddress)&& mBluetoothGatt != null){Log.d(TAG,"Trying to use an existing mBluetoothGatt for connection.");if (mBluetoothGatt.connect())//連接藍牙,其實就是調用BluetoothGatt的連接方法{mConnectionState = STATE_CONNECTING;return true;} else{return false;}}/* 獲取遠端的藍牙設備 */final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);if (device == null){Log.w(TAG, "Device not found. Unable to connect.");return false;}// We want to directly connect to the device, so we are setting the// autoConnect// parameter to false./* 調用device中的connectGatt連接到遠程設備 */mBluetoothGatt = device.connectGatt(this, false, mGattCallback);Log.d(TAG, "Trying to create a new connection.");mBluetoothDeviceAddress = address;mConnectionState = STATE_CONNECTING;System.out.println("device.getBondState==" + device.getBondState());return true;}/*** Disconnects an existing connection or cancel a pending connection. The* disconnection result is reported asynchronously through the* {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}* callback.*//** 取消連接* * *//** * @Title: disconnect * @Description: TODO(取消藍牙連接) * @param 無* @return void * @throws */ public void disconnect(){if (mBluetoothAdapter == null || mBluetoothGatt == null){Log.w(TAG, "BluetoothAdapter not initialized");return;}mBluetoothGatt.disconnect();}/*** After using a given BLE device, the app must call this method to ensure* resources are released properly.*//** * @Title: close * @Description: TODO(關閉所有藍牙連接) * @param 無* @return void * @throws */ public void close(){if (mBluetoothGatt == null){return;}mBluetoothGatt.close();mBluetoothGatt = null;}/*** Request a read on a given {@code BluetoothGattCharacteristic}. The read* result is reported asynchronously through the* {@code BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)}* callback.* * @param characteristic* The characteristic to read from.*//** * @Title: readCharacteristic * @Description: TODO(讀取特征值) * @param @param characteristic(要讀的特征值)* @return void 返回類型 * @throws */ public void readCharacteristic(BluetoothGattCharacteristic characteristic){if (mBluetoothAdapter == null || mBluetoothGatt == null){Log.w(TAG, "BluetoothAdapter not initialized");return;}mBluetoothGatt.readCharacteristic(characteristic);}// 寫入特征值public void writeCharacteristic(BluetoothGattCharacteristic characteristic){if (mBluetoothAdapter == null || mBluetoothGatt == null){Log.w(TAG, "BluetoothAdapter not initialized");return;}mBluetoothGatt.writeCharacteristic(characteristic);}// 讀取RSSipublic void readRssi(){if (mBluetoothAdapter == null || mBluetoothGatt == null){Log.w(TAG, "BluetoothAdapter not initialized");return;}mBluetoothGatt.readRemoteRssi();}/*** Enables or disables notification on a give characteristic.* * @param characteristic* Characteristic to act on.* @param enabled* If true, enable notification. False otherwise.*//** * @Title: setCharacteristicNotification * @Description: TODO(設置特征值通變化通知) * @param @param characteristic(特征值)* @param @param enabled (使能) * @return void * @throws */ public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled){if (mBluetoothAdapter == null || mBluetoothGatt == null){Log.w(TAG, "BluetoothAdapter not initialized");return;}mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);BluetoothGattDescriptor clientConfig = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));if (enabled){clientConfig.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);} else{clientConfig.setValue(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);}mBluetoothGatt.writeDescriptor(clientConfig);}/** * @Title: getCharacteristicDescriptor * @Description: TODO(得到特征值下的描述值) * @param @param 無* @return void * @throws */ public void getCharacteristicDescriptor(BluetoothGattDescriptor descriptor){if (mBluetoothAdapter == null || mBluetoothGatt == null){Log.w(TAG, "BluetoothAdapter not initialized");return;}mBluetoothGatt.readDescriptor(descriptor);}/*** Retrieves a list of supported GATT services on the connected device. This* should be invoked only after {@code BluetoothGatt#discoverServices()}* completes successfully.* * @return A {@code List} of supported services.*//** * @Title: getSupportedGattServices * @Description: TODO(得到藍牙的所有服務) * @param @return 無* @return List<BluetoothGattService> * @throws */ public List<BluetoothGattService> getSupportedGattServices(){if (mBluetoothGatt == null)return null;return mBluetoothGatt.getServices();}}

Androidmainfest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.severn"android:versionCode="1"android:versionName="1.2" ><uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/><applicationandroid:allowBackup="true"android:icon="@drawable/hc"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".ui.Ble_Activity"></activity><service android:name="com.huicheng.service.BluetoothLeService" android:enabled="true"></service></application></manifest>

總結

以上是生活随笔為你收集整理的单片机与手机应用进行蓝牙通讯的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

精品久久久久亚洲 | 国产福利91精品一区二区三区 | 国产精品一区二区三区在线免费观看 | 人人干天天干 | 成人在线视频你懂的 | 免费在线观看av片 | 亚洲国产精品500在线观看 | 亚洲欧美日韩精品久久久 | 欧美日韩在线免费观看 | 又黄又爽又色无遮挡免费 | 精品99在线视频 | 国产免费一区二区三区最新6 | 五月天婷亚洲天综合网精品偷 | 亚洲狠狠丁香婷婷综合久久久 | 国产韩国日本高清视频 | 国内精品久久久久久久久 | 天天干天天干 | 久久久国产精华液 | a黄在线观看| 天天色成人网 | 国产精品久久久久久久久久东京 | 天天草综合网 | 夜夜高潮夜夜爽国产伦精品 | 中文字幕欲求不满 | 国产精品成人av久久 | 粉嫩av一区二区三区免费 | 久草免费手机视频 | 日本黄色免费播放 | 一区二区视频免费在线观看 | 久久国内精品视频 | 免费高清看电视网站 | 国产尤物视频在线 | 亚洲视频综合 | 亚洲精品91天天久久人人 | 日韩美女免费线视频 | 免费成人av在线 | 丁香婷婷综合激情 | 五月婷婷综合网 | 最新av在线播放 | 69xxxx欧美 | 极品久久久久久久 | 精品国产1区2区 | 中文字幕在线观看资源 | 亚洲在线观看av | 国产精品成人免费一区久久羞羞 | 天天射天天干 | 国产一区二区三区高清播放 | 成年人在线观看免费视频 | 中文字幕免费高清 | 国产视频亚洲精品 | 久久久穴 | 天天色视频 | 久久久久久久久久国产精品 | 人人爽人人乐 | 国产精品99久久久久久武松影视 | 日日操日日干 | av中文字幕在线免费观看 | 99久久夜色精品国产亚洲96 | 亚洲精品网站在线 | 国产美女主播精品一区二区三区 | 色福利网站 | 黄色一级大片在线观看 | 色小说av | www.狠狠 | 免费久久精品视频 | 99久久精品国产毛片 | 三级免费黄 | 91精品国产高清自在线观看 | 欧洲视频一区 | 国产一级免费电影 | 欧美日性视频 | 91在线视频一区 | 亚洲激情综合网 | 免费看久久久 | 一区二区丝袜 | av一级在线 | 99精品久久精品一区二区 | 亚洲理论在线 | 国内精品久久久久影院优 | 日韩欧美一区二区三区黑寡妇 | 久久国产免费视频 | 激情文学综合丁香 | 五月婷婷六月丁香在线观看 | 中文字幕在线观看你懂的 | 天堂av在线| 亚洲国产成人精品在线观看 | 久久久久国产免费免费 | 久久精品99国产精品酒店日本 | 在线观看你懂的网址 | 日本公妇色中文字幕 | 日韩一区二区三区视频在线 | 91精品免费看 | 日韩在线色视频 | 天天干天天看 | 天天色天天骑天天射 | 黄色在线免费观看网站 | 亚洲精品欧洲精品 | 色网站在线观看 | 中文字幕亚洲字幕 | 欧美一级欧美一级 | 成年人免费电影在线观看 | 视色网站 | 超碰在线人人草 | 日韩免费福利 | 成人av片在线观看 | 国产精品一区二区av影院萌芽 | 在线视频app | 日本激情动作片免费看 | 在线观看爱爱视频 | 99精品在线直播 | 久草视频在线资源站 | 天堂网一区二区三区 | 黄色一区二区在线观看 | 亚洲精品在线观看av | 美女精品在线 | 免费在线中文字幕 | 国产区精品在线观看 | 久久婷婷国产色一区二区三区 | 日韩欧美高清 | 日韩国产精品毛片 | 字幕网资源站中文字幕 | 99精品国产一区二区三区不卡 | 高清不卡一区二区在线 | 九色一区二区 | 久久精品免视看 | 97国产在线观看 | 国产美女精品人人做人人爽 | av在线激情 | 国产精品视频免费看 | 九色91在线 | 国产女教师精品久久av | 久久观看最新视频 | 三级黄色在线观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 99在线视频免费观看 | 69国产精品视频 | 一区二区三区在线电影 | 开心激情五月婷婷 | 日本中文字幕在线一区 | 久久久国产精品一区二区中文 | 亚洲视频一区二区三区在线观看 | 521色香蕉网站在线观看 | 成年人av在线播放 | 欧美色噜噜 | 国产精品久久久av | 欧美污网站 | 亚洲高清久久久 | 狠狠干婷婷色 | 日韩成人在线一区二区 | 国产亚洲情侣一区二区无 | 国产91小视频 | 久久精品看 | 国内外成人在线视频 | 日本久久综合视频 | 日韩欧美在线第一页 | 911久久香蕉国产线看观看 | 日韩欧美在线观看一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 中文字幕亚洲欧美日韩 | 99综合久久 | 天天操天天干天天爽 | 国产亚洲人成网站在线观看 | 国语对白少妇爽91 | 亚洲国产美女久久久久 | 伊人影院得得 | 干 操 插 | 亚洲成人频道 | 狠狠ri| 日本aaa在线观看 | 波多野结衣电影一区二区 | 夜夜狠狠 | 久草久视频 | 国产精品第52页 | 久久三级毛片 | 亚洲高清av在线 | 国产伦理久久精品久久久久_ | 黄色一级性片 | 久草在线视频首页 | 国产精品永久免费 | 黄色网址中文字幕 | 久久tv| 欧美日本在线观看视频 | 美女视频黄频大全免费 | 日韩在线第一 | 成人在线免费观看网站 | 西西444www| 麻豆视屏| 91精品久久久久久综合乱菊 | 国产老妇av | 在线国产精品视频 | www日韩| 国产一级在线播放 | 日韩在线电影一区二区 | 中文字幕一区二区三区在线观看 | 在线日韩亚洲 | 97爱 | 亚洲理论在线 | 国产福利资源 | 91av免费观看 | www欧美色| 韩国精品福利一区二区三区 | 久久久久久久久毛片 | 丁香高清视频在线看看 | 久久精品理论 | 99 久久久久 | 国产综合精品一区二区三区 | 网址你懂的在线观看 | 毛片一级免费一级 | 日本精品免费看 | 黄av免费在线观看 | 91亚洲网 | 在线观看激情av | 亚洲永久国产精品 | 日韩av成人 | 精品久久久一区二区 | 岛国av在线免费 | 亚洲国产欧美一区二区三区丁香婷 | 天天摸天天弄 | 国产精品video爽爽爽爽 | 99久久婷婷国产精品综合 | 亚洲国产字幕 | 九七人人干 | 久久久精品国产免费观看同学 | av片在线看 | 91亚洲精品视频 | 中文字幕中文 | 在线v片| 国产精品免费久久久久影院仙踪林 | 91黄视频在线 | 91看毛片 | 天天做日日爱夜夜爽 | 国产乱老熟视频网88av | av大片免费在线观看 | 成人网页在线免费观看 | 婷婷www | 人人干狠狠干 | 三级黄色在线 | 色婷婷国产精品一区在线观看 | 天天激情天天干 | 久久在线免费观看 | 亚洲国产69| 蜜臀av性久久久久蜜臀av | 干干操操 | 国产一区二区高清不卡 | 五月婷婷在线综合 | 久草精品视频在线播放 | 国产女v资源在线观看 | 91传媒在线播放 | 欧美日韩精品久久久 | 欧美精品一区二区免费 | 最近2019中文免费高清视频观看www99 | 欧美精品乱码99久久影院 | 99久久精品国产毛片 | 成人毛片一区二区三区 | 日本黄色免费大片 | 国内精品视频在线 | 久久精品牌麻豆国产大山 | 亚洲一区二区视频在线播放 | 日日干综合 | 毛片播放网站 | 国产人成在线观看 | 久久精品一区二区三 | 91精品黄色 | 欧美日一级片 | 91免费在线播放 | 91豆花在线观看 | 久久国产精品一区二区三区 | 精品久久久久久一区二区里番 | 天堂av中文字幕 | 99中文字幕视频 | japanesefreesex中国少妇 | 在线免费成人 | 国产精品大片免费观看 | 久久福利电影 | 国产精品久久久久影视 | 蜜臀久久99静品久久久久久 | 激情开心站 | 欧美一区二区三区在线播放 | 久久久免费在线观看 | 久久精品精品电影网 | 久久亚洲专区 | 开心综合网 | 密桃av在线 | 超碰在97 | 欧洲av在线| 一级精品视频在线观看宜春院 | 国产亚洲午夜高清国产拍精品 | 日韩一级片大全 | 成人9ⅰ免费影视网站 | 操综合| 成人午夜电影在线观看 | 亚洲一区二区麻豆 | 亚洲国内精品 | 午夜精品影院 | 狠狠色丁香婷婷综合欧美 | 欧美与欧洲交xxxx免费观看 | 日韩视频a | 天天色天天搞 | 亚洲成熟女人毛片在线 | 国产欧美日韩精品一区二区免费 | 六月激情婷婷 | 999在线视频| 久久视频免费观看 | 在线看小早川怜子av | 超碰99人人 | 伊人狠狠色 | 久草视频在线观 | 国产亚洲综合性久久久影院 | 日一日操一操 | 亚洲精品乱码久久久久久蜜桃动漫 | 你操综合| 日韩午夜一级片 | 99热999 | 丁香五婷 | 亚洲黄色一级视频 | 午夜精品一区二区三区免费 | 国产在线免费av | 9i看片成人免费看片 | 欧美视频日韩 | 99在线播放 | 亚洲国产成人精品电影在线观看 | 亚洲高清在线视频 | 免费a级黄色毛片 | 日韩欧美在线第一页 | www.亚洲黄| 99精品在这里 | 成人免费视频播放 | 日韩精品一区二区三区高清免费 | 天堂av在线中文在线 | 91综合久久一区二区 | 国产在线日韩 | 91香蕉视频在线下载 | 久久久久免费观看 | 久久精品99视频 | 麻豆成人精品 | 久久国产精品影视 | 天天插天天爱 | 亚洲免费观看在线视频 | 久久9999久久 | 天天天插| 色999五月色| 久久精品一区二区三区视频 | 99久久综合精品五月天 | av在线在线 | 日日摸日日添日日躁av | 欧美91精品久久久久国产性生爱 | 99激情网 | 狠狠色丁香婷婷综合久小说久 | 色网站中文字幕 | 91精品国产欧美一区二区成人 | 久久久久久免费视频 | 亚洲 欧洲av| av在线电影网站 | a色视频| a国产精品 | 91视频91蝌蚪| 综合五月婷婷 | 日韩va欧美va亚洲va久久 | 日批视频 | 99人久久精品视频最新地址 | 免费福利在线播放 | 日日摸日日碰 | 国内精品福利视频 | 麻豆视频免费观看 | 日韩av综合网站 | 日韩一级成人av | 中文字幕资源在线 | 日韩在线观看第一页 | 久草视频免费在线观看 | 色九九在线 | 国产精品v欧美精品v日韩 | 亚洲不卡av一区二区三区 | 久久亚洲欧美日韩精品专区 | 成人久久久精品国产乱码一区二区 | 在线免费观看国产精品 | 成人久久网 | 中文字幕成人网 | 热久在线| japanesexxxhd奶水| 夜夜骑日日 | 91精品久久久久久久久 | 久久免费美女视频 | 久久香蕉国产 | 久久久久久久久久久影院 | 久久首页| 久久久久久久久久国产精品 | a精品视频 | 91在线一区二区 | 在线精品观看国产 | 99久久久久国产精品免费 | 丁香视频全集免费观看 | 中文字幕激情 | 久久精品精品电影网 | 日韩视频中文字幕在线观看 | 在线观看中文字幕av | 81国产精品久久久久久久久久 | 国产伦理一区 | 黄色1级大片 | 国产美女无遮挡永久免费 | 粉嫩aⅴ一区二区三区 | 99久久影院 | 欧美色黄 | 午夜精品在线看 | 日韩字幕在线观看 | 人人爱人人射 | 久久精品永久免费 | 免费成视频 | 在线国产视频 | av中文在线影视 | 99久久精品国产一区 | 国产中文字幕视频在线观看 | 久久精品在线 | 免费韩国av | 亚洲最大免费成人网 | 日韩欧美在线免费 | 国产色婷婷精品综合在线手机播放 | 亚洲成人软件 | 亚洲理论影院 | 国产麻豆精品久久一二三 | 99视频在线看 | 久久久国产高清 | 日日精品 | 青青草国产精品视频 | 国产福利在线免费观看 | 免费中文字幕 | 色老板在线 | 久久草草影视免费网 | 中文字幕资源网在线观看 | 日韩色中色 | 一区在线免费观看 | 亚洲日日日 | 天天干天天综合 | 国产精品亚州 | 国产69精品久久99不卡的观看体验 | 啪啪小视频网站 | 日日夜夜人人天天 | 中国一区二区视频 | 日日摸日日碰 | 亚洲精品乱码久久久久久9色 | 日韩精品你懂的 | 国产色秀视频 | 天天干,天天操 | av中文字幕剧情 | 久久五月网 | 成年美女黄网站色大片免费看 | 二区三区精品 | 久草97| 国产日韩精品一区二区三区在线 | 女人18片| 992tv又爽又黄的免费视频 | 国产精品毛片久久蜜 | 在线а√天堂中文官网 | 国语麻豆 | 视频一区二区在线 | 国产日韩欧美视频在线观看 | 四虎www | 偷拍福利视频一区二区三区 | 中文字幕无吗 | 国产青草视频在线观看 | 久久日本视频 | 亚洲精品视频免费在线观看 | 日韩精品久久久 | 婷婷深爱网 | 午夜黄色 | 国产精品一区二区三区观看 | 国产黄免费看 | 久久视| 一区二区三区韩国免费中文网站 | 欧美综合久久久 | 国产v亚洲v| 亚洲手机天堂 | 国产美女视频免费观看的网站 | 日韩和的一区二在线 | 精品一区二区在线观看 | 成年人在线免费看片 | 欧美精品一区二区三区一线天视频 | 综合久久网站 | 日本电影久久 | 久艹视频在线观看 | 亚洲乱码在线观看 | 午夜资源站 | 欧美性天天 | 狠狠狠狠狠色综合 | 欧美激情视频一二区 | 亚洲天天看 | 国产综合婷婷 | 婷婷久久网 | 午夜性福利 | 麻豆视频免费在线观看 | 国产中的精品av小宝探花 | 99 精品 在线| 欧美性成人 | 成人av一区二区在线观看 | 国产亚洲精品久久久久久大师 | 精品久久久久久久久久久久久 | 在线观看视频在线观看 | 九九热精品视频在线播放 | 色av网站 | 久久免费视频3 | 日韩精品视频免费 | 国产黄在线| 人人干人人草 | 免费三及片 | 久久无码精品一区二区三区 | 国产午夜精品免费一区二区三区视频 | 亚洲一区网 | 91少妇精拍在线播放 | 欧美精品在线一区二区 | 激情五月激情综合网 | 婷婷丁香九月 | 日韩性色| 天天操天天操天天操天天操天天操 | 久久久久久高潮国产精品视 | 久久精品免费电影 | 日韩高清在线不卡 | 丁香av| 国产人成精品一区二区三 | 午夜国产福利在线观看 | 毛片永久新网址首页 | 日韩av成人在线观看 | 人人人爽| 超碰97免费观看 | 色先锋av资源中文字幕 | 久久国产精品久久国产精品 | 国产一区影院 | 久久色视频 | 亚洲成人av免费 | 成人黄色影片在线 | 十八岁免进欧美 | 久久久国产精品久久久 | 免费网站色| 国产成人av电影 | 国产精品九九久久99视频 | 99欧美精品 | 精品日韩在线 | 中文字幕色在线 | 天天做天天爱天天爽综合网 | 色wwww| 日韩欧美国产激情在线播放 | 三级av片| 国产资源精品在线观看 | 综合久久网站 | 久久免费视频在线观看 | 国产亚洲精品久久19p | 一区二区三区韩国免费中文网站 | 国产午夜三级一区二区三桃花影视 | 特级黄色视频毛片 | 97超碰人| 激情五月六月婷婷 | 在线视频手机国产 | 亚洲春色奇米影视 | 一区二区三区手机在线观看 | 亚洲欧美日韩中文在线 | 在线播放精品一区二区三区 | 天天视频亚洲 | 毛片网在线播放 | 成人av视屏 | 人人狠 | 色网站在线免费观看 | 福利久久久| 久久色在线观看 | 九色91av| 婷婷丁香自拍 | 亚洲影院天堂 | 久久8| 国产精品美女久久久 | 玖玖爱在线观看 | 免费黄色网址大全 | 欧美日韩精品在线一区二区 | 亚洲 欧美 综合 在线 精品 | 奇米网777 | 蜜桃视频在线观看一区 | 久草在线免费资源 | 午夜视频免费播放 | 午夜视频黄 | www.五月天色 | 碰超人人| 亚洲成av人影院 | 久久免费国产电影 | 色爽网站 | 91少妇精拍在线播放 | 91在线超碰| 青青射| 久久久久久久久久久久电影 | 日韩高清dvd | 国产成人福利在线 | 日本狠狠色| 99国产精品一区二区 | 99在线精品视频观看 | 精品久久精品 | 麻豆av电影 | av理论电影| 国产资源网 | 国产精品欧美久久久久天天影视 | 国产精品免费看 | 亚洲mv大片欧洲mv大片免费 | 香蕉视频免费在线播放 | 婷婷综合伊人 | 久久国产精品99久久久久久老狼 | 99久久精品国产亚洲 | 99热在线国产精品 | 欧美成人播放 | 9797在线看片亚洲精品 | 日韩不卡高清视频 | 中国一级片在线 | 久久久精品高清 | 国产精品精品国产色婷婷 | 免费在线看v | 91系列在线 | 国产成人在线观看免费 | 国产黄色精品在线观看 | 男女视频国产 | 日韩精品一区二区在线观看 | 日韩免费在线播放 | 狠狠躁日日躁狂躁夜夜躁av | 麻豆传媒在线免费看 | 成人免费在线看片 | 日本在线观看一区二区三区 | 中文字幕a∨在线乱码免费看 | 超碰久热 | 一区二区视频在线播放 | 九九色在线观看 | 91视频传媒 | 91丨九色丨国产在线观看 | 亚洲一区日韩 | 在线观看国产日韩欧美 | 午夜国产一区二区 | 国产精品一区二区在线观看免费 | 免费av免费观看 | 国产精品视频免费观看 | 久久综合久久综合九色 | www.国产精品 | 久久精品久久久久久久 | 激情久久久久久久久久久久久久久久 | 日韩欧美一区二区三区在线 | 日韩欧美不卡 | 国产一二区视频 | 国产精品美女在线观看 | 久久精品精品电影网 | 亚洲精品在线观看网站 | 国产91精品高清一区二区三区 | 精品你懂的 | 手机看国产毛片 | 国内久久久| 国产精品久久毛片 | 天天操天天射天天插 | 天堂av一区二区 | 国产精品自产拍在线观看桃花 | 久久99久久99 | 九九涩涩av台湾日本热热 | 亚州人成在线播放 | 国语精品免费视频 | 天天添夜夜操 | 激情五月综合网 | 久久精品综合一区 | 91免费观看网站 | www.色婷婷| 久久国产精品久久精品国产演员表 | 成人av资源网 | 精品亚洲免费 | 人人干人人艹 | 免费毛片一区二区三区久久久 | 992tv人人网tv亚洲精品 | 五月天色中色 | 国产网站色 | 亚洲国产黄色片 | 欧美国产日韩一区二区三区 | 美女福利视频在线 | 免费视频成人 | 丁香5月婷婷 | 欧美色就是色 | 99久久er热在这里只有精品66 | 亚洲丝袜一区二区 | 欧美aaa级片| 欧美一区二区免费在线观看 | 一区二区三区中文字幕在线 | 国产一区二区中文字幕 | 亚洲成a人片在线观看网站口工 | 日日干网 | 最新日韩在线观看 | 国产午夜一级毛片 | 手机在线免费av | 亚洲国产成人精品久久 | 99国产精品免费网站 | 欧美激情另类 | 9免费视频 | 午夜精品一区二区三区免费 | 国产伦理精品一区二区 | 综合伊人久久 | 国产精品12 | 久久大香线蕉app | 色综合天天色综合 | 国产精品91一区 | 婷婷久久综合九色综合 | 91精品系列| 中文字幕精品三级久久久 | 97精品国产91久久久久久 | 99精品久久久久久久久久综合 | 中文字幕在线观看亚洲 | 插婷婷| 超碰久热 | 美女视频久久久 | 96久久久 | 国产精品免费不 | 国产手机在线视频 | 91精品免费在线 | 99精品视频免费看 | 成人精品一区二区三区中文字幕 | 日韩免费二区 | 久久久国产在线视频 | 国产精品精品视频 | 97色噜噜 | 日韩精品一区二区三区免费观看 | 久草影视在线观看 | 日日爽日日操 | 97操操操 | 国产录像在线观看 | 国产欧美综合视频 | 国产精品久久麻豆 | 黄色成人免费电影 | 国产一区二区在线影院 | av专区在线 | 欧美久久99 | 欧美一级淫片videoshd | 99亚洲精品在线 | 高清色免费 | 福利片视频区 | 992tv在线观看网站 | 偷拍区另类综合在线 | 在线中文字幕av观看 | 2018亚洲男人天堂 | 91丨九色丨蝌蚪丰满 | 一级片免费观看 | 欧美精品一区二区免费 | 国产精品永久在线观看 | 日韩中文字幕91 | 国产高清免费av | 久久9精品 | 就要干b | 欧美精品一区二区蜜臀亚洲 | 成人午夜电影网 | 天天草天天干天天 | 久久精品视频99 | 综合网成人 | 天天干天天干天天操 | 2018好看的中文在线观看 | 伊人天堂av| 成人a v视频 | 国内精品99 | 国产精品九色 | 欧美一级特黄aaaaaa大片在线观看 | 黄色成人毛片 | 亚洲国产中文字幕在线 | 国产免费三级在线观看 | 男女啪啪视屏 | 精品久久久免费视频 | 亚洲人成精品久久久久 | 福利网址在线观看 | 欧美精品一区二区三区四区在线 | 亚洲情影院 | av免费网页| 日韩视频中文字幕在线观看 | 丁五月婷婷 | av在线一级| 九九热在线视频 | 久久久这里有精品 | 五月婷婷视频在线观看 | 91禁在线看 | 亚洲一级在线观看 | 黄色a级片在线观看 | 在线激情网 | 最近能播放的中文字幕 | 免费观看国产成人 | 99麻豆久久久国产精品免费 | 国产一级高清 | 国产一区国产二区在线观看 | 亚洲国产网址 | 高清在线一区二区 | 免费看特级毛片 | 日韩欧美国产激情在线播放 | 婷婷精品在线视频 | 精壮的侍卫呻吟h | 一区二区视频网站 | av网站手机在线观看 | 婷婷中文在线 | 日韩国产高清在线 | 91最新视频| 精品国产一区二区三区久久影院 | 亚洲成色 | 国产精品午夜久久 | 久草在线最新免费 | 免费在线观看污网站 | 欧美性猛片, | 欧美精品久久久久久久久久白贞 | 日韩精品久久久久久久电影竹菊 | 91最新在线观看 | 婷婷国产精品 | 国产99精品 | 一区二区久久久久 | 午夜精品视频一区二区三区在线看 | 成年人视频在线观看免费 | 国产日产精品一区二区三区四区的观看方式 | av短片在线观看 | 91福利国产在线观看 | 免费欧美高清视频 | 最近中文字幕免费大全 | 精品在线观看一区二区 | 久久综合久久综合久久综合 | 一本一本久久a久久 | 国产高清无线码2021 | 天天爱天天操天天干 | 97超碰成人 | 日韩精品三区四区 | 国产一区二区久久久久 | 国产精品五月天 | 色在线免费 | 激情视频一区二区 | 最新精品视频在线 | 丝袜美女视频网站 | 99精品视频中文字幕 | 毛片精品免费在线观看 | 国产一区二区三区网站 | 欧美在线一级片 | 91精品国产92久久久久 | 五月婷综合| 97超碰中文字幕 | 丰满少妇在线观看资源站 | 久久99精品国产一区二区三区 | 成人午夜电影在线观看 | 国产在线精品区 | 欧美在线一二 | 久久免费成人 | 欧美精彩视频在线观看 | 欧美精品小视频 | 色婷婷av国产精品 | 成人久久免费视频 | 久草在线一免费新视频 | 99免费观看视频 | 国产免费又爽又刺激在线观看 | 久久成人国产精品 | 日韩在线观看的 | 日韩精品中文字幕一区二区 | 黄色大片视频网站 | 国产二区视频在线观看 | 91九色老 | 99成人在线视频 | 99热国产在线中文 | 国产精品久久久久久久久久久免费 | 国产精品国产亚洲精品看不卡15 | 午夜精品一区二区国产 | 视频直播国产精品 | 亚洲天堂精品视频在线观看 | 国产一卡二卡四卡国 | 国产精品麻 | 亚洲一级片在线看 | 99热在线国产 | 精品美女久久 | 中文字幕视频一区二区 | 日韩电影中文,亚洲精品乱码 | 中文字幕专区高清在线观看 | 亚洲第一中文字幕 | 91视频观看免费 | 日韩免费不卡视频 | 在线天堂亚洲 | 亚洲在线高清 | 国产成人99久久亚洲综合精品 | 区一区二区三在线观看 | 婷婷丁香六月天 | 国产成人精品综合久久久久99 | 欧美日韩p片 | 国产91亚洲精品 | 久久怡红院 | 最新av电影网站 | 国产男女无遮挡猛进猛出在线观看 | www.五月天激情 | 久久精品小视频 | 正在播放一区二区 | 伊人看片 | 久久精品国产亚洲aⅴ | 久久久久久久久久久福利 | 国产一级淫片在线观看 | 国产白浆在线观看 | 日韩免费高清在线观看 | 日本99久久| 一区二区不卡视频在线观看 | 国产乱对白刺激视频不卡 | 日韩一二三区不卡 | 久国产在线播放 | 国产视频一区二区在线 | 中文字幕一区二区三区久久蜜桃 | 国产三级香港三韩国三级 | 国产亚洲久久 | 精品久久久999 | 99久久精品国产亚洲 | 国产精品成人一区二区三区吃奶 | 99精品国产一区二区三区麻豆 | 99在线观看视频网站 | 亚洲精品456在线播放第一页 | 国产一区二区在线观看视频 | 国产精成人品免费观看 | 夜夜操天天干, | 国产精品久久久久一区二区国产 | 97人人精品 | 91精品视频在线观看免费 | 视频在线亚洲 | 六月色婷婷 | 久久精品久久久久电影 | 久久激情电影 | 午夜精品一二三区 | 亚洲在线网址 | 99精品久久精品一区二区 | 亚洲欧美国产视频 | 91精品国产91久久久久久三级 | 永久免费观看视频 | 黄色毛片视频 | 久久久久成人精品亚洲国产 | 国产免费av一区二区三区 | 亚洲黄色av网址 | 国产日韩欧美在线播放 | 日韩欧美一区二区三区黑寡妇 | 国产视频一区二区在线观看 | 992tv在线成人免费观看 | 亚洲毛片久久 | 色网站在线观看 | 久久伊人91| 激情在线免费视频 | 五月激情电影 | 又爽又黄又无遮挡网站动态图 | 少妇性bbb搡bbb爽爽爽欧美 | 久久免费的视频 | 日韩专区在线播放 | 亚洲精品久久久蜜桃直播 | 精品中文字幕在线观看 | 亚洲视频精选 | 日韩视频区| 久草视频资源 | 五月激情婷婷丁香 | 国产又粗又猛又黄 | 玖玖爱国产在线 | 精品中文字幕在线观看 | 免费看网站在线 | 伊人狠狠干| 国产精品久久视频 | 免费在线精品视频 | av网站在线观看播放 | 久久人人爽人人片av | 久久午夜免费观看 | 一级做a爱片性色毛片www | 日韩av中文| 少妇bbb | 免费观看性生交大片3 | 久久久久麻豆v国产 | 欧美伦理一区二区 | 日韩精品aaa | 久久久久中文字幕 | 国产小视频在线观看免费 | 亚洲综合少妇 | 黄色一级性片 | 免费看短 | 激情综合六月 | 久久国产精品二国产精品中国洋人 | 九九九在线观看视频 | 国产精品一区在线观看你懂的 | 一区二区三区四区在线免费观看 | 一二三区av | 色综合久久久 | 欧美一级视频免费看 | 又色又爽又黄高潮的免费视频 | 国产精品大尺度 | 日韩资源在线播放 | 婷婷视频 | 久草精品视频在线观看 | 亚洲精品乱码久久久久久9色 | 四虎小视频| 成人精品99| 亚洲日本一区二区在线 | 国产麻豆电影 | 国产精品美女免费看 | 国色天香永久免费 | 免费黄在线看 | 射综合网 | 91成人精品一区在线播放69 | 日韩精品中文字幕在线观看 | 色美女在线 | 精品国产99 | 亚洲欧美日韩一二三区 | 黄色精品久久 | 一区二区中文字幕在线 | 欧美精品一区二区在线播放 | 92国产精品久久久久首页 | 四虎国产精品成人免费影视 | 亚洲欧洲精品一区 | 成人av资源网站 | 999电影免费在线观看2020 | 日批视频在线 | 97在线免费视频观看 | 最近中文国产在线视频 | 成人 亚洲 欧美 |